2012-10-01 8 views
30

Я хотел бы создать карту из 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) 
} 
+0

уверен, но я не могу не задаться вопросом, почему вы должны такая вещь, если вы не делали какую-то действительно неоднозначную обработку – dskinner

+1

Поздравляем, ваш код просто [работает] (http://play.golang.org/p/EuYA92BtOR). – zzzz

+1

Несомненно, но это правильный способ сделать это? – Carson

ответ

58

Всякий раз, когда я хотел использовать 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]) 
} 
8

нет ничего технически неправильно о том, что вы написали, но вы должны определите свой собственный тип вокруг map[string]*list.List, чтобы избежать некоторых подводных камней, например, попытаться вызвать метод .Front() на указателе нуля. Или сделайте это map[string]list.List, чтобы избежать этой ситуации. List.List - это всего лишь пара указателей и значение длины; используя указатель list.List на вашей карте, просто добавляет дополнительный случай указателя nil в верхней части случая пустого списка. В любой ситуации вы должны определить новую структуру для этого варианта использования.

я был бы склонен писать так: http://play.golang.org/p/yCTYdGVa5G

1

Мой любимый синтаксис для объявления карты ломтиков:

mapOfSlices := map[string][]string{ 
    "first": {}, 
    "second": []string{"one", "two", "three", "four", "five"}, 
    "third": []string{"quarter", "half"}, 
} 
Смежные вопросы