golang利用反射设置结构体变量的值

版权声明:转载请注明出处,谢谢。 https://blog.csdn.net/butterfly5211314/article/details/82966445

如果需要动态设置struct变量field的情况下, 可以利用reflect来完成.
代码如下:

package main

import (
	"fmt"
	"reflect"
)

// 定义结构体Person
type Person struct {
	Name string
	Age  int
}

func main() {
	person := Person{}
	fmt.Println(person) // 修改前 { 0}
	pp := reflect.ValueOf(&person) // 取得struct变量的指针
	field := pp.Elem().FieldByName("Name") //获取指定Field
	field.SetString("gerrylon") // 设置值

	field = pp.Elem().FieldByName("Age")
	field.SetInt(26)

	fmt.Println(person) // 修改后 {gerrylon 26}
}

事实上对于原始值也是一样的, 要利用指针, 因为golang默认都是传值, 示例如下:

var f float64 = 3.4
fmt.Println(f) // 3.4
p := reflect.ValueOf(&f) // 注意这里一定要是指针, 否则传递给ValueOf的是f的拷贝
v := p.Elem()
v.SetFloat(3.5)
fmt.Println(f) // 3.5

总结:

  • 反射传入的应该是变量的指针
  • 利用 FieldByName()方法可以设置struct的指定key的值, 非常强大.

欢迎补充指正!

猜你喜欢

转载自blog.csdn.net/butterfly5211314/article/details/82966445