2012-10-01 30 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"}, 
}