[英]Use reflect to set values of struct of struct values
我有一些看起来可以正常运行的代码,但最终却什么也没做:
http://play.golang.org/p/TfAWWy4-R8
有一个具有struct类型的字段的结构。 内部结构具有所有字符串字段。
在循环中使用反射,要从外部结构获取所有结构字段。 接下来,在内部结构中填充所有字符串值。 示例代码是从标记中获取文本并将其解析为“,”以获取内部循环的字符串值。
这是应该创建内部结构并将已解析的数据添加到字符串值的主要部分。
t := reflect.TypeOf(Alias{})
alias = reflect.New(t)
for i := 0; i < alias.Elem().NumField(); i++ {
p := alias.Elem().Field(i)
p.SetString(params[i])
}
当您查看示例的输出时,它似乎正在运行,但是在从外部struct打印值之后,它似乎为空:
fmt.Println("Final01 = ", Attr.Final01.Command) // prints empty string
因此,不确定如何将值获取到内部结构Alias {}中
谢谢你的帮助。
这是工作程序。 以下说明。
package main
import "fmt"
import "strings"
import "reflect"
type Alias struct {
Name string
DevicePath string
GuiPath string
Setpoint string
Command string
Status string
FunctionCmds string
}
type Manifold struct {
Final01 Alias "Final01,/Gaspanel/Shared/Final01,,,wOpen,rIsOpen,"
Dump01 Alias "Dump01,/Gaspanel/Shared/Dump01,,,wOpen,rIsOpen,"
N2Vent01 Alias "N2Vent01,/Gaspanel/Shared/N2Vent01,,,wOpen,rIsOpen,"
N2Vent201 Alias "N2Vent201,/Gaspanel/Shared/N2Vent201,,,wOpen,rIsOpen,"
PurgeValve Alias "PurgeValve,/Gaspanel/Shared/Purge01,,,wOpen,rIsOpen,"
}
func MapTagedAliasToChamber(chamber string, struc interface{}) []string {
attributeStruct := reflect.ValueOf(struc).Elem()
typeAttributeStruct := attributeStruct.Type()
attributes := make([]string, attributeStruct.NumField(), attributeStruct.NumField())
for i := 0; i < attributeStruct.NumField(); i++ {
alias := attributeStruct.Field(i)
tag := string(typeAttributeStruct.Field(i).Tag)
name := typeAttributeStruct.Field(i).Name
params := strings.Split(tag, ",")
alias = reflect.New(reflect.TypeOf(Alias{})).Elem()
for i := 0; i < alias.NumField(); i++ {
alias.Field(i).SetString(params[i])
}
attributeStruct.Field(i).Set(alias)
fmt.Printf("%d: %s %s = %v\n", i, name, alias.Type(), alias.Interface())
}
return attributes
}
func main() {
Attr := Manifold{}
MapTagedAliasToChamber("A", &Attr)
fmt.Println("Final01 = ", Attr.Final01.Command)
}
问题出在原始程序的第38行,您在其中创建了一个新的reflect.Value
名为alias
的值表示*Alias
类型的值,然后用您的信息填充了该值,但从未将其写回到Manifold
结构中。
另外,我建议您坚持使用标准的struct-tag格式,该格式可以通过(reflect.StructTag).Get(key string)
进行解析和使用。 并且不要在不需要它们的地方使用字符串,例如rIsOpen
对我来说就像一个布尔值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.