首頁 >後端開發 >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