gpt4 book ai didi

go - 如何编写一个允许指向多个基元类型的通用 Go 函数?

转载 作者:行者123 更新时间:2023-12-03 08:07:54 25 4
gpt4 key购买 nike

我正在尝试使用 Go 泛型编写一个函数来减少代码中的一些样板 if/else block 。我想出了something that works for a single type parameter如下:

func valueOrNil[T *int](value T) any {
if value == nil {
return nil
}
return *value
}

虽然这工作正常,但它并不是真正有用,因为它只允许 *int,而且我希望此代码可以与任何原始类型一起使用。我尝试扩展它以支持第二种类型, as follows :

func valueOrNil[T *int | *uint](value T) any {
if value == nil {
return nil
}
return *value
}

但是,此变体失败并出现编译器错误:

invalid operation: pointers of value (variable of type T constrained by *int|*uint) must have identical base types

任何人都可以发现我在这里做错了什么,或者类似的事情只是“不支持”?

最佳答案

问题似乎在于您试图通过指向类型的指针而不是类型本身实现通用。如果我们将指针移动到参数本身而不是类型参数上,它就可以工作。

解释如下,但这是工作代码:

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
}

关于go - 如何编写一个允许指向多个基元类型的通用 Go 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71623524/

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