栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从界面获取所有字段

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从界面获取所有字段

您可以使用该

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。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/471117.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号