对于任何给定的结构,我想遍历其字段并将任何 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
- 1 回答
- 0 关注
- 201 浏览
添加回答
举报
0/150
提交
取消