gpt4 book ai didi

go - 使用反射取消引用结构指针和访问字段

转载 作者:IT王子 更新时间:2023-10-29 01:56:33 26 4
gpt4 key购买 nike

我正在编写一个递归函数,它遍历结构中的每个原始字段。

我需要能够支持结构字段、结构指针、字段和字段指针。

我试过做这样的事情,对于每个字段,我首先检查它是否是一个指针。如果是,我会打开它的类型,而不仅仅是字段本身。

//Get reflect values and types
valOf := reflect.ValueOf(dest).Elem()
typeOf := valOf.Type()

//Iterate through each field
for i := 0; i < valOf.NumField(); i++ {

var fieldValDeref reflect.Value

//Get reflect value and type of single field
fieldVal := valOf.Field(i)
fieldTyp := typeOf.Field(i)

//Check if field is a pointer. If so, dereference and switch on dereferenced type
if fieldVal.Kind() == reflect.Ptr {
fieldValDeref = fieldVal.Elem()
} else {
fieldValDeref = fieldVal
}


switch fieldValDeref.Kind() {
case reflect.Array, reflect.Chan, reflect.Interface, reflect.Func, reflect.Map, reflect.UnsafePointer:
return errors.New("invalid destination field: " + fieldTyp.Name)

case reflect.Struct:
//Recursive call
break
default:
//Perform Action on Field
..................................

我遇到的问题是,在调用 .Elem() 之后,任何指针(无论是否为结构)的类型都是 reflect.Invalid

无论该字段是结构体还是原语,我如何才能首先取消引用一个字段(如果它是一个指针)然后执行相应的操作?

谢谢

最佳答案

作为mkopriva提到,取消引用 nil 指针将始终返回 reflect.Invalid。解决方案是先创建一个新实例。

if fieldVal.Kind() == reflect.Ptr {
fieldVal.Set(reflect.New(fieldVal.Type().Elem()))
fieldValDeref = fieldVal.Elem()
} else {
fieldValDeref = fieldVal
}

关于go - 使用反射取消引用结构指针和访问字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54012738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com