[英]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.