接口内部的反射数组

时间:2018-12-24 15:26:56

标签: go reflection

我正在尝试通过反射来访问接口内的数组。

在其他字段中,我还有一个字符串数组:

type Configuration struct {
    ...
    SysVars []string
}

我可以这样访问 SysVars 字段:

elem := reflect.ValueOf(conf).Elem()
sysVarsInterface := elem.FieldByName("SysVars").Interface()

至此,当使用GoLand的调试器时,我可以看到 sysVarsInterface 是具有我期望的两个值的接口。由于它是一个数组,因此我假设我需要将其视为接口并再次进行反映?看起来像这样:

sysVarsValue := reflect.ValueOf(&sysVarsInterface)
sysVarsElem := sysVarsValue.Elem()

但对其进行迭代失败:

for i:=0; i< sysVarsElem.NumField(); i++ {
    vname := sysVarsElem.Type().Field(i).Name
    fmt.Println(vname)
}

说:

panic: reflect: call of reflect.Value.NumField on interface Value

任何想法我在做什么错?
我以this作为参考

1 个答案:

答案 0 :(得分:3)

无需重复思考,您可以像这样迭代SysVars:

p := &Configuration{
SysVars :[]string{"a","b","c"},
}

s:= reflect.ValueOf(p).Elem().FieldByName("SysVars")
for i:=0 ; i< s.Len() ; i++ {
   fmt.Println(s.Index(i).String())
}