使用GO reflect包,我希望获得特定类型的nil指针,例如,我希望reflect.Value用值nil而不是*0来表示*int

我现在得到的零值是这样的,但这是*0而不是nil

// varType is a reflect.Type
reflect.New(reflect.PtrTo(varType).Elem())

会给我一个零值,例如*0代表*int

但我现在不能完全锻炼的是,比如说*int类型的reflect.Value,它是nil,而不是*0

我理解为什么.Set(reflect.ValueOf(nil))不起作用.也许我错过了关键的一步?

推荐答案

使用reflect.Zero()而不是reflect.New().reflect.New()分配给定类型的值,并返回指向它的指针(包装在reflect.Value中).

reflect.Zero()不分配新值,它返回给定类型的零值(包装在reflect.Value中).因此,如果您传递*intreflect.Type描述符或任何其他指针类型,因为指针类型的零值是nil,所以您将返回nil指针.

例如:

var i int
varType := reflect.TypeOf(i)
v := reflect.Zero(reflect.PtrTo(varType)).Interface()
fmt.Printf("Type: %T, Value: %v\n", v, v)

if p, ok := v.(*int); ok {
    fmt.Println("v holds *int, its value is:", p)
}

输出(在Go Playground上试用):

Type: *int, Value: <nil>
v holds *int, its value is: <nil>

但是请注意,您必须调用Value.Interface()才能获得reflect.Value的值(离开反射世界).还要注意,这个返回的接口值(它的类型是interface{}any)将是notnil,但它打包了一个*int类型和一个nil指针值.详情见Hiding nil values, understanding why Go fails here

Go相关问答推荐

消费者在NAT中是如何实现的

如何在jsonrpc服务器的服务器端捕获错误?

Golang文本/模板序列范围

Json.Unmarshal() 和 gin.BindJson() 之间的区别

使用Dockertest进行Golang SQL单元测试的基本设置

如何在 Go 中将 int 转换为包含 complex128 的泛型类型?

我的神经网络(从头开始)训练,让它离目标更远

当填充通道的函数调用未嵌入 goroutine 时,为什么我会遇到死锁?

如何使用带有方法的字符串枚举作为通用参数?

在 Go 模板中对照片使用随机 Int

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

Golang计算 struct struct 中的字段数

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

如何在 GORM 中迭代一个 int 数组

如何优雅地映射到 Go 中返回可变长度数组的方法?

使用 Go 读取 TOML 文件时结果为空

Go 导入范围查找 protobuf 类型

如何在测试中传递用户名和密码等参数

为什么 Go 的构造函数要返回地址?

如何解决考虑预分配 (prealloc) lint?