使用reflect设置struct值的struct值

时间:2014-11-21 02:44:46

标签: go

我有一些代码看起来有效,但最终什么也没做:

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 {}

感谢您的帮助。

1 个答案:

答案 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对我来说听起来像布尔值。

相关问题