2014-11-21 50 views
0

我有一些代碼,看起來是工作,但什麼都不做到底:使用反映設置結構的結構的值的值

http://play.golang.org/p/TfAWWy4-R8

有一個具有結構類型的字段的結構。內部結構包含所有字符串字段。

在循環中使用反射,希望從外部結構中獲取所有結構字段。接下來,填充內部結構中的所有字符串值。示例代碼從標籤獲取文本並在「,」解析它以獲取內部循環的字符串值。

這是應該創建內部結構並將解析的數據添加到字符串值的主要部分。

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]) 
    } 

它看起來就像當你從例子中,輸出工作,但打印從外部結構的值後,它似乎是空的:

fmt.Println("Final01 = ", Attr.Final01.Command) // prints empty string 

所以不知道如何獲取值進入內部結構Alias {}

感謝您的任何幫助。

+1

爲什麼在設置之前將別名重新分配給新值? – LinearZoetrope 2014-11-21 06:50:58

回答

1

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) 

} 

問題是你原來的計劃,在那裏你創建了一個新的名爲reflect.Value代表alias類型*Alias的值的38行,然後用您的信息填寫,但從來沒有寫過它放回你的Manifold結構。

此外,我建議你堅持標準的結構標籤格式,可以通過(reflect.StructTag).Get(key string)解析和使用更容易。並且不要在不需要它們的地方使用字符串,例如rIsOpen聽起來像一個布爾值給我。

+0

我不知道'Tag.Get',所以一定會實現。所有別名字段都用於創建字符串,如「AT/CHA/PurgeValve/Gaspanel/Purge01.rIsOpen」,並且所有轉換爲布爾值等操作都在後面完成。很好的回答謝謝。 – gigatropolis 2014-11-21 15:16:49