Go中如何实现接收泛型函数的NilOr泛型函数?
解决泛型函数作为参数传递时的实例化问题
首先纠正调用写法,并给出正确的NilOr实现:
正确的NilOr实现
// 通用版本,支持任意T类型 func NilOr[T any](ptr *T, fn func(T) error) error { if ptr == nil { return nil } return fn(*ptr) } // 若需限定T必须符合signed约束,可改为: // func NilOr[T signed](ptr *T, fn func(T) error) error { // if ptr == nil { // return nil // } // return fn(*ptr) // }
正确的调用方式
if err := NilOr(foo, GEZ); err != nil { accumulator = append(accumulator, err) }
错误原因解析
你遇到的cannot use generic function GEZ without instantiation报错,是因为Go编译器处理泛型函数作为参数时,必须明确其类型参数实例。之前的写法将泛型函数GEZ放在参数列表首位,此时编译器无法推导T的具体类型,自然无法完成GEZ的实例化。
调整参数顺序,将指针ptr前置后,编译器会先从ptr的类型(如*int)推导出T为int,进而自动完成GEZ[int]的实例化——由于int符合signed约束,完全匹配要求。
另外需要注意:你原始调用中错误传递了*foo(解引用后的值),而NilOr需要接收指针类型参数,这也是必须修正的细节。
内容的提问来源于stack exchange,提问作者Tim Hockin
相关产品推荐
相关产品推荐

