首頁 > 後端開發 > Golang > 如何建立接受介面實作指標的通用 Go 函數?

如何建立接受介面實作指標的通用 Go 函數?

Mary-Kate Olsen
發布: 2024-12-21 05:25:14
原創
175 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板