2016-08-30 68 views
2

這是我的YAML文件:如何獲得鑰匙,地圖[接口{}]接口{}

db: 
    # table prefix 
    tablePrefix: tbl 

    # mysql driver configuration 
    mysql: 
     host: localhost 
     username: root 
     password: mysql 

    # couchbase driver configuration 
    couchbase: 
     host: couchbase://localhost 

,我使用go-YAML庫來解讀YAML文件變量:

config := make(map[interface{}]interface{}) 
yaml.Unmarshal(configFile, &config) 

配置值:

map[mysql:map[host:localhost username:root password:mysql]  couchbase:map[host:couchbase://localhost] tablePrefix:tbl] 

如何獲得數據庫 - > MySQL的 - >用戶名在無覆蓋的配置價值ut預定義的結構類型

+1

請出示一個例子。您提供的代碼有效,不會導致此錯誤。 – JimB

+0

我更新我的問題@ jimb –

回答

1

YAML使用字符串鍵。您是否嘗試過:

config := make(map[string]interface{}) 

要訪問嵌套屬性,請使用type assertions

mysql := config["mysql"].(map[string][string]) 
mysql["host"] 

一個常見的模式是別名通用映射類型。

type M map[string]interface{} 

config := make(M) 
yaml.Unmarshal(configFile, &config) 
mysql := config["mysql"].(M) 
host := mysql["host"].(string) 
+0

我有一個動態配置文件,可能涉及數組值 –

+1

「」gopkg.in/yaml.v2「包的默認類型是'map [interface {}] interface {}' – JimB

0

如果不定義時間提前的類型,你需要從你遇到的每個interface{}assert正確的類型:

if db, ok := config["db"].(map[interface{}]interface{}); ok { 
    if mysql, ok := db["mysql"].(map[interface{}]interface{}); ok { 
     username := mysql["username"].(string) 
     // ... 
    } 
} 

https://play.golang.org/p/koSugTzyV-