Go泛型问题:零参数可变参函数的类型参数推导
解决Go泛型可变参函数无参数时的类型推断问题
问题根源确实是当没有传入opts参数时,编译器无法推断出Opt的类型,即便此时不需要使用该类型。以下是两种可行的单函数解决方案:
方案1:Go 1.21+ 推荐使用类型参数默认值
Go 1.21引入了泛型类型参数默认值特性,我们可以为Opt指定一个默认类型(比如空结构体struct{}),让编译器在无opts参数时自动使用该默认类型完成推断:
func Constructor[F any, Opt any = struct{}](f F, opts ...Opt) {}
这样两种调用场景都能正常运行:
- 带参数调用:
Constructor(func() *myService { return ... }, 1, 2, 3)(Opt被推断为int) - 无参数调用:
Constructor(func() *myService { return ... })(Opt自动采用默认的struct{})
方案2:兼容Go 1.20及以下版本
如果无法升级Go版本,可通过显式指定类型参数解决无参数调用的问题:
// 显式指定Opt为struct{}(或any等任意类型) Constructor[func() *myService, struct{}](func() *myService { return ... })
或者也可以传入一个空的切片(需显式匹配Opt类型),但这种方式调用略显繁琐:
Constructor(func() *myService { return ... }, []struct{}{}...)
内容的提问来源于stack exchange,提问作者m4r73n
相关产品推荐
相关产品推荐

