我正在使用go练习反射,我正在尝试实现以下目标, 具有结构类型,其字段是指向字符串切片的指针。
既然指针为零,我想创建一个切片,添加一个值并在结构中设置该指针以指向新创建的切片,并使用反射进行所有操作。
我创建了以下示例代码来演示我在做什么:
package main
import (
"log"
"reflect"
)
type UserInfo struct {
Name string
Roles *[]string
UserId int
}
func main() {
var myV UserInfo
myV.Name="moshe"
myV.UserId=5
v := reflect.ValueOf(&myV.Roles)
t := reflect.TypeOf(myV.Roles)
myP := reflect.MakeSlice(t.Elem(),1,1)
myP.Index(0).SetString("USER")
v.Elem().Set(reflect.ValueOf(&myP)) <-- PANIC HERE
log.Print(myV.Roles)
}
这会使消息惊慌
panic: reflect.Set: value of type *reflect.Value is not assignable to type *[]string
当然,切片不会创建指针,所以如果我这样做:
v.Elem().Set(myP.Convert(v.Elem().Type()))
我明白了
panic: reflect.Value.Convert: value of type []string cannot be converted to type *[]string
但是当我尝试将地址转换为
v.Elem().Set(reflect.ValueOf(&myP).Convert(v.Elem().Type()))
我明白了
panic: reflect.Value.Convert: value of type *reflect.Value cannot be converted to type *[]string
我还缺少什么?
谢谢!
答案 0 :(得分:1)
您正尝试使用指向reflect.Value
的指针的reflect.Value
来设置值,这绝对不同于*[]string
逐步建立价值并逐步发展:
// create the []string, and set the element
slice := reflect.MakeSlice(t.Elem(), 1, 1)
slice.Index(0).SetString("USER")
// create the *[]string pointer, and set its value to point to the slice
ptr := reflect.New(slice.Type())
ptr.Elem().Set(slice)
// set the pointer in the struct
v.Elem().Set(ptr)