首頁 > 後端開發 > Golang > 如何處理 Go 中實作介面的指標的泛型類型?

如何處理 Go 中實作介面的指標的泛型類型?

DDD
發布: 2024-12-29 08:42:16
原創
782 人瀏覽過

How Can I Handle Generic Types for Pointers Implementing Interfaces in Go?

在Go 中實作介面的指標的泛型類型

在Go 中,使用介面時,建立操作的泛型函數非常有用實作這些介面的資料類型。但是,如果介面表示指標類型,則確定指標的泛型類型可能具有挑戰性。

為了解決這個問題,Go 提供了一種機制來聲明帶有類型參數的接口,該機制允許定義期望的接口實現類型是指向其類型參數的指針。例如,考慮以下接口:

type A interface {
  SomeMethod()
}
登入後複製

如果您透過結構指針實現此接口,例如:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}
登入後複製

嘗試傳遞時可能會遇到問題指向Aimpl 的指針,該函數需要帶有A 參數的函數。原因是泛型函數需要一個實作 A 介面的類型,而不是指向實作它的類型的指標。

要解決此問題,您可以修改介面定義以指定類型參數:

type A[P any] interface {
  SomeMethod()
  *P
}
登入後複製

這表示介面期望實現它的類型是指向類型參數 P 的指標。

接下來,您需要調整接受修改後的介面類型的泛型函數的簽章:

func Handler[P any, T A[P]](callback func(result T)) {
  result := new(P)
  callback(result)
}
登入後複製

泛型函數現在採用具有T 類型參數的函數,該函數必須實作修改後的A 介面。當您使用指向 Aimpl 的指標呼叫函數時,它將正確識別實作類型並按預期執行。

但是,如果您無法修改原始A 介面的定義,您可以建立自己的A 介麵包含類型參數的包裝介面:

type MyA[P any] interface {
  A
  *P
}
登入後複製

透過包裝原始接口,您可以採用與之前:

func Handler[P any, T MyA[P]](callback func(result T)) {
  result := new(P)
  callback(result)
}
登入後複製

這允許您使用實現原始A 介面的指標類型,同時保持所需的通用行為。

以上是如何處理 Go 中實作介面的指標的泛型類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板