golang通過反射設定結構體欄位的值

思維的深度發表於2018-02-08
type Person struct {
	Name   string  `json:"name"`
	Age       int	`json:"age"`
}

func SetValueToStruct(name string,age int) *Person {
		p := &Person{}
		v := reflect.ValueOf(p).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(p)
v.FieldByName("Name").Set(reflect.ValueOf(name))
v.FieldByName("Age").Set(reflect.ValueOf(age))

相關文章