我試圖通過反射循環修改空指針字段“MyField”的間接值。我感到恐慌:反映:在零值上調用 reflect.Value.Set。關于如何做的任何想法?https://play.golang.org/p/IJvA_J_cD60package mainimport ( "fmt" "reflect")type MyStruct struct { MyField *string}func main() { s := MyStruct{} v := reflect.ValueOf(s) for i := 0; i < v.NumField(); i++ { valueField := v.Field(i) fieldName := v.Type().Field(i).Name if fieldName == "MyField" && valueField.Kind() == reflect.Ptr { valueField.Elem().Set(reflect.ValueOf("some changed name")) fmt.Printf("the elem after change: %v\n", valueField.Elem()) } } fmt.Print(*s.MyField)}多謝!
1 回答

慕村9548890
TA貢獻1884條經驗 獲得超4個贊
該程序有兩個問題。
無法設置該字段,因為v
它不是可尋址的值。要獲取可尋址值,請從指向的指針創建一個 reflect.Value s
:
s := MyStruct{} v := reflect.ValueOf(&s).Elem()
該程序試圖通過一個 nil 指針設置一個值。反射代碼與*s.MyField = "some changed name"
. 如果問題中的 MyField 為 nil,則此語句將 panic。要解決此問題,請將指針設置到該字段中:
t := "some changed name" valueField.Set(reflect.ValueOf(&t))
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消