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

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

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

Go
守着一只汪 2022-01-04 13:53:41
如果没有反射,可以将多个类型添加到类型 []interface{} 的列表中。像这样:package mainimport "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 mainimport (    "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)}
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

该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


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号