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)

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM