将字符串数组转换为字段名称

时间:2016-02-12 12:42:01

标签: go

新手问题: 我想打印一个库的各种变量(正确的名称是什么?reflect.TypeOf(servers)给出了[]lib.Server

我想做这样的事情,但这显然不起作用:

servers, err := GetClient().GetServers() //call to external API

serverVariables := []string{}
serverVariables = append(serverVariables, "Name")
serverVariables = append(serverVariables, "IPAddress")

for _, server := range servers {
   for _,element := range serverVariables {
     fmt.Println(server.element)
   }
}

我已经可以做的是以下内容(但我希望使用上述方法):

servers, err := GetClient().GetServers() //call to external API

for _, server := range servers {
   fmt.Println(server.Name)
   fmt.Println(server.IPAddress)
}

给出以下输出:

ServerNameOne
192.168.0.1
ServerNameTwo
192.168.0.2

1 个答案:

答案 0 :(得分:0)

您可能想要使用反思:

for _, server := range servers {
    v := reflect.ValueOf(server)
    for _, element := range serverVariables {
        fmt.Println(v.FieldByName(element))
    }
}

您还应将serverVariables初始化更改为serverVariables := []string{}

游乐场示例:https://play.golang.org/p/s_kzIJ7-B7

在我看来,您拥有Python或JavaScript等动态语言的经验。 Go编译并强类型化。除了反射速度较慢,使用它时编译器无法帮助您找到代码中的基本错误,最重要的是丢失访问变量的类型。 有关http://blog.golang.org/laws-of-reflection

的更多信息

所以我强烈建议你保持现有的方法:

for _, server := range servers {
   fmt.Println(server.Name)
   fmt.Println(server.IPAddress)
}