首页 > 解决方案 > 使用反射,如何将值设置为结构字段(指针)

问题描述

我尝试通过反射将值设置为结构字段(指针字段),但失败了。

  1. 我得到了一个结构字段的名称,所以使用 FieldByName 来获取该字段
  2. 该字段是一个指针。
  3. 我尝试使用 FieldByName().Set FieldByName().SetPointer 来设置值。
type t struct {
    b *int
}

func main() {
    t := new(ts)
    a := new(int)
    ss := reflect.ValueOf(t).FieldByName("b").Set(a)
}
type t struct {
    b *int
}

func main() {
    t := new(ts)
    a := new(int)
    ss := reflect.ValueOf(t).FieldByName("b").SetPointer(a)
}

第一个代码:=======> ./test.go:14:50: 不能在 reflect.ValueOf(t).FieldByName("b") 的参数中使用 a (type *int) 作为类型 reflect.Value .Set ./test.go:14:50: reflect.ValueOf(t).FieldByName("b").Set(a) 用作值

第二个代码:=======> ./test.go:14:57: 不能使用 a (type *int) 作为类型 unsafe.Pointer 在参数中以 reflect.ValueOf(t).FieldByName("b") .SetPointer ./test.go:14:57: reflect.ValueOf(t).FieldByName("b").SetPointer(a) 用作值

我想使用反射使指针字段(名称“b”)分配一个空间并设置一个值。

标签: goreflect

解决方案


type ts struct {
    B *int    //field must be exported
}

func main() {
    var t ts
    foo := 5
    a := &foo
    //Use Elem() to indirect through the pointer and get struct field
    //Use reflect.ValueOf(a) to satisfy Set() signature
    reflect.ValueOf(&t).Elem().FieldByName("B").Set(reflect.ValueOf(a))
    fmt.Println(*t.B)
}

游乐场https://play.golang.org/p/gZt0ahTZMIi


推荐阅读