您可以使用该
reflect.TypeOf()函数获取
reflect.Type类型描述符。从那里,您可以列出存储在界面中的动态值的字段。
例:
type Point struct { X int Y int}var reply interface{} = Point{1, 2}t := reflect.TypeOf(reply)for i := 0; i < t.NumField(); i++ { fmt.Printf("%+vn", t.Field(i))}输出:
{Name:X PkgPath: Type:int Tag: Offset:0 Index:[0] Anonymous:false}{Name:Y PkgPath: Type:int Tag: Offset:4 Index:[1] Anonymous:false}Type.Field()调用的结果是一个
reflect.StructField值为,其中
struct包含字段名称以及其他内容:
type StructField struct { // Name is the field name. Name string // ...}如果还需要这些字段的值,则可以使用
reflect.ValueOf()获取
reflect.Value(),然后可以使用
Value.Field()或
Value.FieldByName():
v := reflect.ValueOf(reply)for i := 0; i < v.NumField(); i++ { fmt.Println(v.Field(i))}输出:
12
在Go Playground上尝试一下。
注意:通常将指向struct的指针包装在接口中。在这种情况下,您可以使用
Type.Elem()和
Value.Elem()“导航”指向的类型或值:
t := reflect.TypeOf(reply).Elem()v := reflect.ValueOf(reply).Elem()
如果您不知道它是否是指针,则可以使用
Type.Kind()和
Value.Kind()进行检查,并将结果与
reflect.Ptr:
t := reflect.TypeOf(reply)if t.Kind() == reflect.Ptr { t = t.Elem()}// ...v := reflect.ValueOf(reply)if v.Kind() == reflect.Ptr { v = v.Elem()}在Go Playground上尝试使用此变体。
有关Go的思考的详细介绍,请阅读博客文章:The Laws of Reflection。



