reflect: call of reflect.Value.NumField on ptr Value
报错代码
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) }
邮箱: 1090055252@qq.com