为了账号安全,请及时绑定邮箱和手机立即绑定

我可以得到一个字段是否已经在 golang 中分配了反射

我可以得到一个字段是否已经在 golang 中分配了反射

Go
红糖糍粑 2023-04-24 16:15:25
我有一个结构如下:type Demo struct{      A string      B string}我有一个实例如下:demo := Demo{A:"a"}A的字段已显式分配值,但字段B未分配值。现在,我想知道是否存在一些方法可以通过反射获取实例A的字段?在这里,我想获得字段A。
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

无法确定某个字段是否显式分配了一个值,但可以确定是否存在不等于该字段零值的字段。


遍历字段。如果字段的值不等于字段类型的零值,则返回 true。


func hasNonZeroField(s interface{}) bool {

    v := reflect.ValueOf(s)

    if v.Kind() == reflect.Ptr {

        v = v.Elem()

    }

    t := v.Type()

    for i := 0; i < t.NumField(); i++ {

        sf := t.Field(i)

        fv := v.Field(i)

        switch sf.Type.Kind() {

        case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:

            if !fv.IsNil() {

                return true

            }

        case reflect.Struct:

            if hasNonZeroField(fv.Interface()) {

                return true

            }

        // case reflect.Array:

        // TODO: call recursively for array elements

        default:

            if reflect.Zero(sf.Type).Interface() != fv.Interface() {

                return true

            }

        }

    }

    return false

}

在操场上运行它



查看完整回答
反对 回复 2023-04-24
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信