允许反射从 Go 中的结构中获取未导出的字段
Allow reflect to get unexported fields from a struct in Go
我目前正在使用 reflect 从结构中获取字段,并 return 返回值作为接口值的一部分。我遇到了未导出字段的问题,我希望能够获取未导出的值并 return 它们以及导出的字段。当我尝试从未导出的字段中获取值时,出现以下错误:
reflect.Value.Interface: cannot return value obtained from unexported
field or method [recovered]
我一直在使用 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()
时出现错误。有没有办法通过反射解决这个问题,所以它 return 所有导出和未导出的字段值?
Is there a way around this with reflect so it returns all exported and unexported field values?
没有
那会破坏不导出的目的。
我目前正在使用 reflect 从结构中获取字段,并 return 返回值作为接口值的一部分。我遇到了未导出字段的问题,我希望能够获取未导出的值并 return 它们以及导出的字段。当我尝试从未导出的字段中获取值时,出现以下错误:
reflect.Value.Interface: cannot return value obtained from unexported field or method [recovered]
我一直在使用 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()
时出现错误。有没有办法通过反射解决这个问题,所以它 return 所有导出和未导出的字段值?
Is there a way around this with reflect so it returns all exported and unexported field values?
没有
那会破坏不导出的目的。