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

Go 将字符串数组转换为字段名,go,Go,新手问题: 我想打印库的各种变量(这是正确的名称吗?reflect.TypeOf(servers)gives[]lib.Server) 我想这样做,但这显然不起作用: servers, err := GetClient().GetServers() //call to external API serverVariables := []string{} serverVariables = append(serverVariables, "Name") serverVariables = app

新手问题: 我想打印库的各种变量(这是正确的名称吗?
reflect.TypeOf(servers)
gives
[]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)
   }
}
我已经可以做到以下几点(但我想使用上述方法):

给出以下输出:

ServerNameOne
192.168.0.1
ServerNameTwo
192.168.0.2

反射是您可能想要使用的:

for _, server := range servers {
    v := reflect.ValueOf(server)
    for _, element := range serverVariables {
        fmt.Println(v.FieldByName(element))
    }
}
您还应该将
serverVariables
初始化更改为
serverVariables:=[]字符串{}

游乐场示例:

在我看来,您对一些动态语言(如Python或JavaScript)有经验。Go是编译的,并且是强类型的。除了反射速度较慢之外,当使用它时,编译器不能帮助您查找代码中的基本错误,最重要的是您丢失了所访问变量的类型。 更多关于

因此,我强烈建议您保持目前的做法:

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

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

是否要创建包含每个服务器详细信息(名称、IP地址)的服务器切片?否,
servers
已在多个服务器上保存所有详细信息,其中每个服务器都有
Name
IPAddress
元素。将更新问题a bitI只是不明白您要打印什么?请参阅我的多个编辑以使其更清楚,希望您完全正确,我来自JS和Python;-)在本例中,serverVariables初始化确实是错误的,因为我从原始源代码复制/粘贴了它。它可以工作,谢谢!我现在意识到,编译器在使用
FieldByName
方法时不会捕捉打字错误和其他内容。另外一个小问题是
fmt.Println(reflect.ValueOf(server).FieldByName(element))
比您使用附加变量
v
更快/更好?实际上速度较慢,因为它必须为您想要阅读的每个字段创建reflect.Value。事实上,我自己可能已经想到了;-)