指向接口实现的通用指针
在 Go 中,定义接受指向接口的指针的通用函数可能具有挑战性。考虑一个带有 SomeMethod() 的接口 A:
type A interface { SomeMethod() }
并且假设有一个 A 的实现作为结构体指针:
type Aimpl struct {} func (a *Aimpl) SomeMethod() {}
创建一个接受函数的通用函数 Handler对于 A 参数,最好定义:
func Handler[T A](callback func(result T)) { // Essentially what I'd like to do is result := &Aimpl{} (or whatever T is) callback(result) }
但是,有一些限制考虑一下。
尝试使用任何类型参数
最初,似乎可以定义一个带有类型参数的接口以允许指针实现:
type MyA[T any] interface{ A *T }
但是,这会失败并出现以下情况错误:
result does not implement interface. It's a pointer to a type, not a type
解决方案:类型参数化接口
要克服这个问题,可以使用要求实现类型为指针的类型参数来声明接口其类型参数:
type A[P any] interface { SomeMethod() *P }
有了这个接口,Handler 函数就可以修改:
func Handler[P any, T A[P]](callback func(result T)) { result := new(P) callback(result) }
现在,代码可以按预期调用 Handler:
Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
使用 Interface Wrapper 替代
如果定义A 无法修改,另一种方法是将其包装在自定义中接口:
type MyA[P any] interface { A *P }
并相应地修改 Handler 函数:
func Handler[P any, T MyA[P]](callback func(result T)) { result := new(P) callback(result) }
两种解决方案都允许创建接受接口实现指针的通用函数。
以上是如何创建接受接口实现指针的通用 Go 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!