gpt4 book ai didi

pointers - 检查基础类型是否为具有反射的结构

转载 作者:行者123 更新时间:2023-12-01 21:11:23 25 4
gpt4 key购买 nike

给定这个结构

type A struct {
b *B
c string
d string
}

我想检查一下哪些字段在指针类型后面有一个结构,所以我特别想创建一个条件,该条件仅在遍历字段 b时才为真。根据我使用反射文档所做的尝试,我总是以 invalid Value类型结尾,这种情况不允许我在以后的所有方法 panic 中走得更远。
package main

import (
"fmt"
"reflect"
)

type A struct {
b *B
c string
d string
}

type B struct {
}

func main() {
val := reflect.ValueOf(A{})
for i := 0; i < val.Type().NumField(); i++ {
if val.Field(i).Kind() == reflect.Ptr {
fmt.Println(reflect.Indirect(val.Field(i)).Kind())
}
fmt.Println(val.Field(i).Kind())
}
}

https://play.golang.org/p/oRry3ZubRxI

最佳答案

您获得的值无效,因为val.b指针字段是nil,并且您无法取消引用nil指针。如果您想让代码正常工作,则必须使用有效的指针对其进行初始化:

val := reflect.ValueOf(A{b: &B{}})

通过此更改,它可以工作并输出(在 Go Playground上尝试):
struct
ptr
string

如果希望它工作而不必初始化指针,则必须处理类型而不是值:
val := reflect.ValueOf(A{})
t := val.Type()
for i := 0; i < t.NumField(); i++ {
if ft := t.Field(i).Type; ft.Kind() == reflect.Ptr {
fmt.Println(ft.Elem().Kind())
}
fmt.Println(t.Field(i).Type.Kind())
}

输出结果相同,请在 Go Playground上尝试一下。

关于pointers - 检查基础类型是否为具有反射的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60582788/

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