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)

}

 

posted @ 2020-07-21 16:33  Black_Climber  阅读(5755)  评论(0编辑  收藏  举报