如何访问map [interface {}] interface {}中的键

时间:2016-08-30 15:48:30

标签: go yaml

这是我的yaml文件:

io.on('connection', function(socket) {
  socketID = socket.client.id;
  socket.join(socketID);
  console.log('a user connected ' + socketID);
});

我使用go-yaml库将yaml文件解组为变量:

db:
    # table prefix
    tablePrefix: tbl

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

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

配置值:

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

如何访问 db - > mysql - >没有预定义结构类型的配置中的用户名

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果您未提前定义类型,则需要assert来自您遇到的每个interface{}的正确类型:

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-