報錯代碼
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) }
