2 回答
TA贡献1906条经验 获得超10个赞
问题似乎是您试图通过指向类型的指针而不是类型本身来实现通用。如果我们将指针移动到参数本身而不是类型参数上,它就可以工作。
解释如下,但这是工作代码:
func valueOrNil[T ~int | ~uint](value *T) T {
if value == nil {
var zero T
return zero
}
return *value
}
所以而不是这个(这是行不通的):
func valueOrNil[T *int | *uint](value T) any
你可以这样做:
func valueOrNil[T int | uint](value *T) any
但是,您可能希望更进一步并处理基础类型:
func valueOrNil[T ~int | ~uint](value *T) any
这将允许自定义类型与函数一起使用:
type Thing int
var thing Thing
println(valueOrNil(thing))
您可能要考虑的另一个方面是对返回类型也进行泛化。您可以使用相同的T参数来执行此操作。
例如:
func valueOrNil([T ~int | ~uint](value *T) T
但这意味着您需要更改部分实现。而不是这个:
if value == nil {
return nil
}
你可以这样做:
if value == nil {
var zero T
return zero
}
- 2 回答
- 0 关注
- 63 浏览
添加回答
举报