Создать карту списков
Я хотел бы создать карту экземпляров container/list.List
. Правильно ли это сделать?
package main
import (
"fmt"
"container/list"
)
func main() {
x := make(map[string]*list.List)
x["key"] = list.New()
x["key"].PushBack("value")
fmt.Println(x["key"].Front().Value)
}
Ответы
Ответ 1
Всякий раз, когда я хотел использовать List
, я обнаружил, что срез был правильным выбором, например
package main
import "fmt"
func main() {
x := make(map[string][]string)
x["key"] = append(x["key"], "value")
x["key"] = append(x["key"], "value1")
fmt.Println(x["key"][0])
fmt.Println(x["key"][1])
}
Ответ 2
Мой любимый синтаксис для объявления карты срезов:
mapOfSlices := map[string][]string{
"first": {},
"second": []string{"one", "two", "three", "four", "five"},
"third": []string{"quarter", "half"},
}
Ответ 3
нет ничего технически неправильного в том, что вы написали, но вы должны определить свой собственный тип вокруг map[string]*list.List
, чтобы избежать некоторых ловушек, например, пытаться вызвать метод .Front()
на указателе nil. Или сделайте это map[string]list.List
, чтобы избежать этой ситуации. List.List - это всего лишь пара указателей и значение длины; используя указатель list.List на вашей карте, просто добавляет дополнительный случай указателя nil в верхней части случая пустого списка. В любой ситуации вы должны определить новую структуру для этого варианта использования.
Я хотел бы написать так:
http://play.golang.org/p/yCTYdGVa5G