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。事实上,我自己可能已经想到了;-)