Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 界面内反射阵列_Go_Reflection - Fatal编程技术网

Go 界面内反射阵列

Go 界面内反射阵列,go,reflection,Go,Reflection,我试图通过反射访问接口中的数组 在其他字段中,我还有一个字符串数组: type Configuration struct { ... SysVars []string } 我可以像这样访问SysVars字段: elem := reflect.ValueOf(conf).Elem() sysVarsInterface := elem.FieldByName("SysVars").Interface() 至此,当使用GoLand的调试器时,我可以看到sysVarsInterfac

我试图通过反射访问接口中的数组

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

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

知道我做错了什么吗
我将其用作参考

无需双重反射,您可以像这样迭代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())
}
p:=&配置{
SysVars:[]字符串{“a”、“b”、“c”},
}
s:=reflect.ValueOf(p.Elem().FieldByName(“SysVars”)
对于i:=0;i
无需双重反射,您可以像这样迭代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())
}
p:=&配置{
SysVars:[]字符串{“a”、“b”、“c”},
}
s:=reflect.ValueOf(p.Elem().FieldByName(“SysVars”)
对于i:=0;i
如果知道切片字段的确切类型,可以使用
slice:=elem.FieldByName(“SysVars”).Interface()([]字符串)
,即类型断言。使用普通for/range循环在
切片上进行just循环,无需再进行反射。如果您知道它只是一个切片,但不知道其元素的类型,则使用reflect
sysVarsValue:=elem.FieldByName(“SysVars”)
(无需调用Interface())。然后对i:=0的do
进行循环;i
然后使用
sysVarsValue.index(i)
对循环中的切片进行索引。如果您知道切片字段的确切类型,可以使用
slice:=elem.FieldByName(“SysVars”).Interface()([]字符串)
,即类型断言。使用普通for/range循环在
片上的just循环不再需要反射。如果您知道它只是一个片,但不知道其元素的类型,则使用reflect
sysVarsValue:=elem.FieldByName(“SysVars”)
(无需调用Interface()),然后对i:=0;i
循环该do
,然后使用
sysVarsValue.index(i)对循环中的切片进行索引
.perfetct!另外,如果这没有超出本文的范围,您是否介意解释一下为什么我的解决方案不正确,而您的解决方案是?@yoadw当您开始对从接口中提取的变量进行反射时,接口包含两对值和一个类型,无需再次向接口断言。这就像解析将int转换为int,然后再将int转换为string。你可以在本页“反射定律:perfect!”中了解到很多关于反射的知识。另外,如果这没有超出本文的范围,你介意解释一下为什么我的解决方案不正确,而你的解决方案是?@yoadw当你开始对一个变量进行反射时,一个接口包含两个对,一个值和一个类型从接口重新提取底层数据无需再次向接口断言。这就像将字符串解析为int,然后再次将int转换为字符串一样。您可以在本页中了解有关反射的很多信息,反射定律: