2012-08-03 100 views
3

Newbee警告。與字符串鍵和字符串或切片值的映射?

我可以用字符串鍵和「任何」作爲值來製作地圖嗎?目標是擁有配置數據的地圖。該數據可以是單個字符串(或布爾值或整數,但將其限制爲字符串很好),也可以是字符串數組。示例:我想要存儲這些項目:

levels = 3 
extra-directories = ["foo","bar","baz"] 

第一個選項始終是單個值(字符串對我來說應該是OK)。第二個選項是零個或多個值。

目標是讓我可以存儲這些值的單個地圖,並且在查看地圖時,我可以使用switch x.(type)來查明該值。

回答

4

interface{}是接受任何類型的類型。

conf := map[string] interface{} { 
    "name": "Default", 
    "server": "localhost", 
    "timeout": 120, 
} 

conf["name"]interface{}不是string,和conf["timeout"]interface{}不是int。您可以通過conf["name"]受到充分interface{}fmt.Println功能,但你不能把它傳遞給需要stringstrings.ToUpper,除非你知道interface{}的價值是string(你這樣做)的功能和斷言它的類型:

name := conf["name"].(string) 
fmt.Println("name:", strings.ToUpper(name)) 
server := conf["server"].(string) 
fmt.Println("server:", strings.ToUpper(server)) 
timeout := conf["timeout"].(int) 
fmt.Println("timeout in minutes:", timeout/60) 

可能適合你的問題的另一個解決方案是定義一個結構:

type Config struct { 
    Name string 
    Server string 
    Timeout int 
} 

創建配置:

conf := Config{ 
    Name: "Default", 
    Server: "localhost", 
    Tiemout: 60, 
} 

訪問配置:

fmt.Println("name:", strings.ToUpper(conf.Name)) 
fmt.Println("server:", strings.ToUpper(cnf.Server)) 
fmt.Println("timeout in minutes:", conf.Timeout/60) 
+0

技術上接口{}是所有類型實現一個接口。這是一個微妙的區別,但值得一提。 – 2012-08-04 00:59:56

+0

@JeremyWall我仍然需要這麼多的學習。謝謝! – topskip 2012-08-05 18:39:13

1

是的,你可以使用類型爲map[string]interface{}的地圖。