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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-21 05:25:14184瀏覽

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