Reflection Reflect.Value.FieldByName导致恐慌

Reflection Reflect.Value.FieldByName导致恐慌,reflection,go,Reflection,Go,调用反射值的.FieldByName方法时出现以下错误,确切的错误是:- panic: reflect: call of reflect.Value.FieldByName on ptr Value 代码是:- s := reflect.ValueOf(&value).Elem() (value is a struct) metric := s.FieldByName(subval.Metric).Interface() (subval.Metric is a string) 我知道

调用反射值的.FieldByName方法时出现以下错误,确切的错误是:-

panic: reflect: call of reflect.Value.FieldByName on ptr Value
代码是:-

s := reflect.ValueOf(&value).Elem() (value is a struct)
metric := s.FieldByName(subval.Metric).Interface() (subval.Metric is a string)
我知道这并不多,但这是我能得到的全部信息


这里有一个指向代码的链接:

您的
值已经是指向结构的指针。尝试在代码中打印出
s.Kind()

没有理由获取
value
的地址,然后在该
reflect.value
上调用
Elem()

s := reflect.ValueOf(value).Elem()
metric := s.FieldByName(subvalMetric).Interface()
fmt.Println(metric)

如果您添加了少量println,您就知道会发生什么:

输出:

<*main.Struct1 Value>
<main.Struct1 Value>
abc

abc

错误信息非常清楚。你能在操场上做一个可运行的例子吗?(并且
value
可能是一个结构,
&value
是一个指针)用一个指向操场上代码的链接更新了主帖子()我个人将
s:=reflect.ValueOf(value.Elem()
替换为
s:=reflect.Indirect(reflect.ValueOf(value))
,这样同样的代码将在结构和指向结构的指针上工作。
<*main.Struct1 Value>
<main.Struct1 Value>
abc