登录
首页 >  Golang >  Go问答

获取未导出的字段在 Go 结构体中使用 Reflect 允许

来源:stackoverflow

时间:2024-02-18 18:18:24 491浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《获取未导出的字段在 Go 结构体中使用 Reflect 允许》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我目前正在使用 reflect 从结构中获取字段并将值作为接口值的切片返回。我遇到了未导出字段的问题,我希望能够获取未导出的值并将它们与导出的字段一起返回。当我尝试从未导出的字段中获取值时,出现以下错误:

reflect.value.interface:无法返回未导出的值 字段或方法[已恢复]

我一直使用 https://github.com/fatih/structs 作为我的代码的基础,并希望它能够处理未导出的字段。

// Values returns us the structs values ready to be converted into our repeatable digest.
func (s *StructWrapper) Values() []interface{} {
    fields := s.structFields()

    var t []interface{}

    for _, field := range fields {
        val := s.value.FieldByName(field.Name)
        if IsStruct(val.Interface()) {
            // look out for embedded structs, and convert them to a
            // []interface{} to be added to the final values slice
            t = append(t, Values(val.Interface())...)
        } else {
            t = append(t, val.Interface())
        }
    }

    return t
}

// Values converts the given struct to a []interface{}. For more info refer to
// StructWrapper types Values() method.  It panics if s's kind is not struct.
func Values(s interface{}) []interface{} {
    return New(s).Values()
}

// New returns a new *StructWrapper with the struct s. It panics if the s's kind is
// not struct.
func New(s interface{}) *StructWrapper {
    return &StructWrapper{
        raw:   s,
        value: strctVal(s),
    }
}

func strctVal(s interface{}) reflect.Value {
    v := reflect.ValueOf(s)

    // if pointer get the underlying element≤
    for v.Kind() == reflect.Ptr {
        v = v.Elem()
    }

    if v.Kind() != reflect.Struct {
        panic("not struct")
    }

    return v
}

// structFields returns the exported struct fields for a given s struct. This
// is a convenient helper method to avoid duplicate code in some of the
// functions.
func (s *StructWrapper) structFields() []reflect.StructField {
    t := s.value.Type()

    var f []reflect.StructField

    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        f = append(f, field)
    }

    return f
}

当我在未导出字段上的值方法中调用 val.interface() 时,出现错误。有没有办法用 reflect 来解决这个问题,以便它返回所有导出和未导出的字段值?


解决方案


有没有办法用 Reflect 来解决这个问题,以便它返回所有导出和未导出的字段值?

没有。

这将违背不导出的目的。

到这里,我们也就讲完了《获取未导出的字段在 Go 结构体中使用 Reflect 允许》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>