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

如何使用反射初始化结构中的零切片

如何使用反射初始化结构中的零切片

Go
阿波罗的战车 2022-07-11 16:27:34
对于任何给定的结构,我想遍历其字段并将任何 nil 切片设置为空切片。但是,切片是不可寻址的,因此不可设置。如何设置任何 nil 切片的值?示例: https ://goplay.space/#iV6OHkYVTrupackage mainimport (    "fmt"    "reflect")type Foo struct {    IntSlice []int    StrSlice []string}func main() {    foo := Foo{}    fmt.Println(foo.IntSlice == nil)    initNilSlices(foo)    fmt.Println(foo.IntSlice == nil)}func initNilSlices(x interface{}) {    v := reflect.ValueOf(x)    for i := 0; i < v.NumField(); i++ {        f := v.Field(i)        if f.Kind() == reflect.Slice {            t := f.Type()            f.Set(reflect.MakeSlice(t, 0, 0))        }    }}
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

如果通过,则无法更新/修改foo,因为那将是副本,并且您只能修改副本(而不是原始值)。initNilSlices()foo


这是错误消息“提示”的内容:


panic: reflect: reflect.Value.Set using unaddressable value

您reflect.Value从非指针值中获得了 ,甚至reflect.ValueOf()获得的是副本,因此它不允许您修改它,因为它不是您想要的。


您必须传递以下地址foo:


initNilSlices(&foo)

并在initNilSlices()使用中Value.Elem():


v := reflect.ValueOf(x).Elem()

这样它就可以工作并输出(在Go Playground上试试):


true

false


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

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