我試圖通過反射循環(huán)修改空指針字段“MyField”的間接值。我感到恐慌:反映:在零值上調(diào)用 reflect.Value.Set。關(guān)于如何做的任何想法?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貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
該程序有兩個(gè)問題。
無法設(shè)置該字段,因?yàn)?code>v它不是可尋址的值。要獲取可尋址值,請從指向的指針創(chuàng)建一個(gè) reflect.Value s
:
s := MyStruct{} v := reflect.ValueOf(&s).Elem()
該程序試圖通過一個(gè) nil 指針設(shè)置一個(gè)值。反射代碼與*s.MyField = "some changed name"
. 如果問題中的 MyField 為 nil,則此語句將 panic。要解決此問題,請將指針設(shè)置到該字段中:
t := "some changed name" valueField.Set(reflect.ValueOf(&t))
- 1 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報(bào)
0/150
提交
取消