首页 > 后端开发 > Golang > 如何创建接受接口实现指针的通用 Go 函数?

如何创建接受接口实现指针的通用 Go 函数?

Mary-Kate Olsen
发布: 2024-12-21 05:25:14
原创
116 人浏览过

How Can I Create a Generic Go Function That Accepts a Pointer to an Interface Implementation?

指向接口实现的通用指针

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板