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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-21 05:25:14118浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn