当前位置:   article > 正文

golang 反射 reflect 设置 struct 字段_golang 反射赋值struct

golang 反射赋值struct

目录

说明1 reflect.Value区分CanSet和Can not Set

说明2 将值转成reflect.Value类型

说明3  reflect.ValueOf 参数必须是一个 指针 或  interface Elem()才可以正常调用

实例代码


说明1 reflect.Value区分CanSet和Can not Set

所以, 必须要返回成Can set的reflect.Value
如:

s := reflect.ValueOf(&t).Elem()

然后就可以happy的设值了, 可是不能随便设值的, 一个通用的方法就是使用Set(v Value)方法,

说明2 将值转成reflect.Value类型

下面的这段代码就是转成Value类型

sliceValue := reflect.ValueOf([]int{1, 2, 3}) // 这里将slice转成reflect.Value类型

说明3  reflect.ValueOf 参数必须是一个 指针 或  interface Elem()才可以正常调用

func (Value) Elem
func (v Value) Elem() Value

Elem returns the value that the interface v contains or that the pointer v points to. It panics if v's Kind is not Interface or Ptr. It returns the zero Value if v is nil.

Elem返回接口v包含的值或指针v指向的值。 如果v的Kind不是Interface或Ptr,它会感到恐慌。 如果v为零,它将返回零值。

实例代码

代码1:

  1. func Destroy(subj interface{}) {
  2. stype := reflect.ValueOf(subj).Elem()
  3. field := stype.FieldByName("Status")
  4. if field.IsValid() {
  5. field.SetString("Destroyed")
  6. }
  7. }
  8. func TestDestroy(t *testing.T) {
  9. // Initialize data
  10. jaeger := Jaeger{Name: "Cherno Alpha", Country: "RU", Status: "Active"}
  11. kaiju := Kaiju{Alias: "Scissure", Origin: "Sydney", Status: "Unknown"}
  12. shatterdome := Shatterdome{Location: "Lima"}
  13. // Destroy everything
  14. Destroy(&jaeger)
  15. Destroy(&kaiju)
  16. Destroy(&shatterdome)
  17. // Check the result
  18. if jaeger.Status != "Destroy" {
  19. t.Error("jaeger was not destroyed")
  20. }
  21. if kaiju.Status != "Destroy" {
  22. t.Error("kaiju was not destroyed")
  23. }
  24. }

代码2:

  1. type T struct {
  2. Age int
  3. Name string
  4. Children []int
  5. }
  6. t := T{12, "someone-life", nil}
  7. s := reflect.ValueOf(&t).Elem()
  8. s.Field(0).SetInt(123) // 内置常用类型的设值方法
  9. sliceValue := reflect.ValueOf([]int{1, 2, 3}) // 这里将slice转成reflect.Value类型
  10. s.FieldByName("Children").Set(sliceValue)

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/164118
推荐阅读
相关标签
  

闽ICP备14008679号