Reflect.Value.FieldByName导致恐慌

时间:2014-07-02 17:34:29

标签: 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)

我知道这并不多,但这是我能得到的所有信息。

以下是Go Playground代码的链接:http://play.golang.org/p/E038cPOoGp

2 个答案:

答案 0 :(得分:12)

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

没有理由采用value的地址,然后在Elem()上调用reflect.Values := reflect.ValueOf(value).Elem() metric := s.FieldByName(subvalMetric).Interface() fmt.Println(metric) 取消引用您刚创建的指针。

{{1}}

答案 1 :(得分:3)

如果你添加少量println,你就会明白会发生什么:

http://play.golang.org/p/-kaz105_En

for _, Value:= range NewMap {
    s := reflect.ValueOf(&Value).Elem()
    println(s.String())
    println(s.Elem().String())
    metric := s.Elem().FieldByName(subvalMetric).Interface()
    fmt.Println(metric)
}

输出:

<*main.Struct1 Value>
<main.Struct1 Value>
abc
相关问题