Go中的反射类型和值

Her*_*rks 4 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() 
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*erg 6

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

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

您曾经reflect.Value获得过值的第一个字段的字符串表示i.首先,您曾经v.Elem()获取指向的struct的Value i,然后访问第一个Field的data(.Field(0)),最后将该数据转换为string(.String()).