首页 >后端开发 >Golang >如何在 Go 中使用接口实现指针处理泛型函数?

如何在 Go 中使用接口实现指针处理泛型函数?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-31 01:28:09963浏览

How to Handle Generic Functions with Interface-Implementing Pointers in Go?

接口实现指针的泛型类型

在 Go 中,创建一个接受带有接口参数的函数的泛型函数可能具有挑战性当该接口的实现是指向结构体的指针时。

考虑以下内容接口:

type A interface {
  SomeMethod()
}

我们有一个作为结构指针的接口的实现:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}

我们想要定义一个通用函数,它接受带有 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)
}

但是,由于result没有实现接口,所以会出现错误;它是指向类型的指针,而不是类型本身。

解决方案 1:带有类型参数的接口

要解决这个问题,我们可以使用类型参数声明接口,要求实现它的类型是指向其类型参数的指针:

type A[P any] interface {
    SomeMethod()
    *P
}

通过此修改,处理程序的签名需要需要调整:

func Handler[P any, T A[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

解决方案2:包装接口

如果无法修改A的定义,我们可以创建一个包装接口:

type MyA[P any] interface {
    A
    *P
}

并相应地修改处理程序的签名:

func Handler[P any, T MyA[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

以上是如何在 Go 中使用接口实现指针处理泛型函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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