golang通过反射获取和设置结构体字段的值

2019/5/3 文章分类: GO语言技巧

参考一

 type MyStruct struct {
        N int
    }
    n := MyStruct{ 1 }

    // get 
    immutable := reflect.ValueOf(n)
    val := immutable.FieldByName("N").Int()
    fmt.Printf("N=%d\n", val) // prints 1

    // set
    mutable := reflect.ValueOf(&n).Elem()
    mutable.FieldByName("N").SetInt(7)
    fmt.Printf("N=%d\n", n.N) // prints 7
    

参考二

type Person struct {
    Name   string  `json:"name"`
    Age       int   `json:"age"`
}

func SetValueToStruct(name string,age int) *Person {
        p := &Person{}
        v := reflect.ValueOf℗.Elem()
        v.FieldByName("Name").Set(reflect.ValueOf(name))
        v.FieldByName("Age").Set(reflect.ValueOf(age))
        return p
}


func main()  {
    p := SetValueToStruct("张三",18)
    fmt.Println(*p)
}

注:可能出现的错误

1.结构体首字母必须大写,否则会出现:panic: reflect: reflect.Value.Set using value obtained using unexported field
在Golang中首字母的大小写代表着访问权限,首字母小写则包外无法访问
2. 反射需要使用地址 否则会出现:panic: reflect: reflect.Value.Set using unaddressable value
如下代码就会出现panic

p := Person{}
v := reflect.ValueOf℗
v.FieldByName("Name").Set(reflect.ValueOf(name))
v.FieldByName("Age").Set(reflect.ValueOf(age))