使用反射在Go中向[]interface{}添加元素

3

如果没有反射,我们可以将多种类型添加到类型[]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)
}

使用反射可以实现吗?我尝试了以下代码,但是出现了panic错误,提示:“panic: reflect.Set: value of type string is not assignable to type []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)
}
1个回答

5

Foo字段已经是[]interface{}类型,因此SliceOf正在创建一个[][]interface{},这就是您看到的错误的原因。

删除SliceOf,然后使用field.Set(rslice)将新值设置回结构体字段。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接