2012-10-01 31 views
30

我想创建container/list.List实例的地图。这是正确的方式去解决它吗?创建列表的Golang地图

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指针只是在空列表的情况下增加了一个零指针的额外情况。在任何一种情况下,你都应该为这个用例定义一个新的结构体。

我会倾向于把它写这样的: http://play.golang.org/p/yCTYdGVa5G

1

我最喜欢的语法来声明图切片的:

mapOfSlices := map[string][]string{ 
    "first": {}, 
    "second": []string{"one", "two", "three", "four", "five"}, 
    "third": []string{"quarter", "half"}, 
}