LINUX.ORG.RU

пример из книги

 


0

1

В приведенном ниже примере отображение используется для записи количества вызовов Add с данным списком строк. Пример использует функцию fmt.Sprintf для преобразования среза строк с помощью символов преобразования %q в одну строку, которая является подходящим ключом отображения

var m = make(map[string]int)
func k(list []string) string { return fmt.Sprintf("%q", list) }
func Add(list, []string) string { m[k(list)]++ }
func Count(list, []string) int { return m[k(list)] }

package main

import (
	"fmt"
)

func k(list []string) string { return fmt.Sprintf("%q", list) }
func Add(list []string) string { m[k(list)]++ }
func Count(list []string) int { return m[k(list)] }

func main() {
	var m = make(map[string]int)
	fmt.Println("")
}

Ответ на: комментарий от Xwo

Даже пытался не буду.

Во-первых оно просто не скомпилируеться (на глаз видно несколько синтаксических ошибок).

Во-вторых оно уже с недурным таким запашком.

beastie ★★★★★
()
fmt.Sptrintf("%q", list)

должно быть

func listString(list []string) string {
	var sb strings.Builder
	for _, elem := range list {
		elem = strconv.Quote(elem)
		sb.WriteString(elem)
	}
	return sb.String()
}
А теперь забудем на секунду, что про ту запятую и посмотрим вот на это
func Add(list, []string) string { m[k(list)]++ }
которое должно быть

func Add(list []string) {
	m[k(list)]++
}

Хотя, если подумать, то какого рожна там делает глобальная переменная. У нас в детском саду за такое в угол ставили.

type M map[string]int

func (m M) Add(list []string) {
	m[listString(list)]++
}

func (m M) Count(list []string) int {
	return m[listString(list)]
}
ну и соответствено
func main() {
    var m = make(M)

    // [...] stuff here

}

https://play.golang.org/p/27hRAcio8aE

Если strconv.Quote(elem) не нужно, то тогда лучше использовать

strings.Join(list, ",")
который основан на strings.Builder

kostyarin_ ★★
()
Ответ на: комментарий от Xwo

В книжке задачка это починить или что? Второй блок явно не из книги, ты же сам так написал?

Надо убрать пару запятых и возвращаемый тип, а на %q у меня go build, кстати, не сругался:

package main

import "fmt"

var m = make(map[string]int)
func k(list []string) string { return fmt.Sprintf("%q", list) }
func Add(list []string) { m[k(list)]++ }
func Count(list []string) int { return m[k(list)] }

func main() {
        l := []string{"1", "22", "333"}

        for i := 0; i < 30; i++ {
                Add(l)
        }

        fmt.Println(Count(l))
}
WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от kostyarin_

Поддерживаю твое решение. К этому можно хотя бы интерфейс написать и тестировать.

deterok ★★★★★
()
Ответ на: комментарий от beastie

Я боюсь что, учитывая предполагаемый уровень неофита, пример Ведьмака может оказатсья полезнее, в плане понимания.

kostyarin_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.