在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中文網其他相關文章!