我有一些代码看起来有效,但最终什么也没做:
http://play.golang.org/p/TfAWWy4-R8
具有struct类型的结构。内部结构具有所有字符串字段。
在循环中使用reflect,想要从外部struct获取所有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 {}
感谢您的帮助。
答案 0 :(得分:2)
Here是工作计划。以下说明。
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
对我来说听起来像布尔值。