【发布时间】:2021-02-19 02:47:15
【问题描述】:
对于任何给定的结构,我想遍历其字段并将任何 nil 切片设置为空切片。但是,切片是不可寻址的,因此不可设置。如何设置任何 nil 切片的值?
示例: https://goplay.space/#iV6OHkYVTru
package main
import (
"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))
}
}
}
【问题讨论】:
-
我很好奇您为什么要这样做 -
nil切片和 0 长度切片之间的差异非常罕见。 -
我试图使用一个打印出空配置的包。但由于某种原因,它不适用于 nil 切片。最终使用了不同的包...
标签: go struct reflection slice