簡體   English   中英

使用反射來設置結構值的結構值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM