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

对于任何给定的结构,我想遍历其字段并将任何 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))

        }

    }

}


阿波罗的战车
浏览 205回答 1
1回答

慕哥9229398

如果通过,则无法更新/修改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上试试):truefalse
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go