Go中的反射类型和值

时间:2012-10-29 03:59:23

标签: reflection go

我不太清楚此代码段的行为。

func show(i interface{}) {
    switch t := i.(type) {
    case *Person:
      t := reflect.TypeOf(i)  //what t contains?   
      v := reflect.ValueOf(i)  //what v contains?
      tag := t.Elem().Field(0).Tag
      name := v.Elem().Field(0).String() 
    }
}

反射中的类型和值有什么区别?

1 个答案:

答案 0 :(得分:6)

reflect.TypeOf()返回reflect.Typereflect.ValueOf()返回reflect.Valuereflect.Type允许您查询与所有具有相同类型的变量相关联的信息,而reflect.Value允许您查询信息并对任意类型的数据执行操作。

在上面的示例中,您使用reflect.Type来获取Person结构中第一个字段的“标记”。您从*Person的类型开始。要获取Person的类型信息,请使用t.Elem()。然后,您使用.Field(0).Tag提取了有关第一个字段的标记信息。您传递的实际值i无关紧要,因为第一个字段的标记是该类型的一部分。

您使用reflect.Value获取值i的第一个字段的字符串表示形式。首先,您使用v.Elem()获取i指向的结构的值,然后访问第一个Field的数据(.Field(0)),最后将该数据转换为字符串({{1 }})。