如果没有反射,可以将多种类型添加到类型[] 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)
}
Run Code Online (Sandbox Code Playgroud)
这可能与反思有关吗?我尝试以下但我得到一个恐慌的说法:" 恐慌: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)
}
Run Code Online (Sandbox Code Playgroud)
该Foo字段已经是类型[]interface{},因此SliceOf创建一个[][]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)
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/gWK3-cP_MN
| 归档时间: |
|
| 查看次数: |
747 次 |
| 最近记录: |