Go - 通过反射附加到 []interface{}

如果没有反射,可以将多个类型添加到类型 []interface{} 的列表中。像这样:


package main


import "fmt"


func main() {

    var foo []interface{}

    foo = append(foo, "Test")

    foo = append(foo, "Foo")

    foo = append(foo, 10)

    fmt.Printf("%v\n", foo)

}

这可以通过反射实现吗?我尝试了以下操作,但我得到了一个恐慌说:“恐慌:reflect.Set:类型字符串的值不可分配给类型 []interface {} ”


package main


import (

    "fmt"

    "reflect"

)


func rf(inf interface{}) {

    val := reflect.Indirect(reflect.ValueOf(inf))

    field := val.FieldByName("Foo")

    rslice := reflect.MakeSlice(reflect.SliceOf(field.Type()), 0, 5)

    v := reflect.Indirect(reflect.ValueOf("Test"))

    rslice = reflect.Append(rslice, v)

}


func main() {

    var s struct {

        Foo []interface{}

    }

    rf(&s)

    fmt.Printf("%+v\n", s)

}


守着一只汪
浏览 188回答 1
1回答

小唯快跑啊

该Foo字段已经是 type []interface{},因此SliceOf正在创建 a [][]interface{},这就是导致您看到的错误的原因。删除SliceOf, 然后使用field.Set(rslice)将新值设置回 struct 字段。func rf(inf interface{}) {    val := reflect.Indirect(reflect.ValueOf(inf))    field := val.FieldByName("Foo")    rslice := reflect.MakeSlice(field.Type(), 0, 5)    v := reflect.Indirect(reflect.ValueOf("Test"))    rslice = reflect.Append(rslice, v)    field.Set(rslice)}http://play.golang.org/p/gWK3-cP_MN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go