Reflection Reflect.Value.FieldByName导致恐慌
调用反射值的.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) 我知道
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