報錯代碼
package main import ( "fmt" "reflect" ) // 生命結構體 type Person struct { Name string Age string }
// 數值類型通過反射利用結構體賦值 //var a string = "zhao" //arr := reflect.ValueOf(&a) //arr.Elem().SetString("ok") //fmt.Println(a) func main() {
// 聲明 結構對象 沒有分配內存 只是聲明 var per Person
// 構建反射 類型 *** 重點:在使用反射賦值的 不管是值類型 還是 結構體類型 都需要 使用反射的 地址
// 再執行代碼 之后 會報錯:reflect: call of reflect.Value.NumField on ptr Value
// 是因為 val是地址,我們需要需要地址所對的值,才能調用NumField() 方法。
val := reflect.ValueOf(&per) tp := reflect.TypeOf(per) for i:=0;i<val.NumField();i++{ if tp.Field(i).Name == "Name"{ val.Elem().Field(i).SetString("zhao") } if tp.Field(i).Name == "Age"{ val.Elem().Field(i).SetString("12") } } fmt.Println("~~~~~~~~~~~~~~~~~~") fmt.Println(per) }
改正后代碼:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age string } //var a string = "zhao" //arr := reflect.ValueOf(&a) //arr.Elem().SetString("ok") //fmt.Println(a) func main() { var per Person val := reflect.ValueOf(&per) //val2 := reflect.ValueOf(&per) tp := reflect.TypeOf(per) for i:=0;i<val.Elem().NumField();i++{ if tp.Field(i).Name == "Name"{ val.Elem().Field(i).SetString("zhao") } if tp.Field(i).Name == "Age"{ val.Elem().Field(i).SetString("12") } } fmt.Println("~~~~~~~~~~~~~~~~~~") fmt.Println(per) }