[英]Golang set nil string pointer value in struct using reflect
使用Go的反射包,如果指針為nil,是否可以在結構中設置指針? 查看reflect包,如果reflect.Value.CanSet()
為false
那么任何Set()
調用都會產生恐慌。 是否有另一種解決方法,僅使用反射包,而不依賴於對結構的任何直接引用? 例如,如何在下面的代碼中將空姓氏設置為“ Johnson”?
package main
import (
"fmt"
"reflect"
)
type Person struct {
FirstName *string
LastName *string
}
func main() {
p := Person{}
firstName := "Ryan"
p.FirstName = &firstName
rp := reflect.ValueOf(p)
fmt.Println("rp:", rp)
for i := 0; i < rp.NumField(); i++ {
fmt.Printf("%s: Pointer: %d CanSet: %t\n", rp.Type().Field(i).Name, rp.Field(i).Pointer(), rp.Field(i).Elem().CanSet())
}
rp.Field(0).Elem().SetString("Brian")
fmt.Println(*p.FirstName)
// Yields nil pointer error
// rp.Field(1).Elem().SetString("Johnson")
// fmt.Println(*p.LastName)
fmt.Println(rp.Field(1).Type())
fmt.Println(rp.Field(1).CanSet())
// fmt.Println(rp.Field(1).Elem().Type()) // nil pointer here also
fmt.Println(rp.Field(1).Elem().CanSet())
}
首先,您需要一個指向Person{}
的指針,因為您需要為LastName
字段設置一個值。
p := &Person{}
然后,您可以為LastName
字段設置有效的指針值,這將允許您設置字符串值:
rp.Field(1).Set(reflect.New(rp.Field(1).Type().Elem()))
rp.Field(1).Elem().SetString("Jones")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.