指向介面實現的通用指標
在 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中文網其他相關文章!