使用Go 泛型存取聯合約束中的共享方法
在Go 泛型(v1.18) 中,類型聯合約束允許定義接受以下介面的介面來自多種類型的值。然而,問題是如何存取這些類型之間的共享方法。
考慮以下範例:
type A struct {} type B struct {} type AB interface { *A | *B } func (a *A) some() bool {...} func (b *B) some() bool {...} func some[T AB](x T) bool { return x.some() // error }
在此程式碼中,雖然 A 和 B 共用某個方法,但嘗試從某些[TAB]存取它時發生錯誤。這是因為編譯器只辨識在約束介面中明確宣告的方法。
要解決此問題,可以將共享方法加入介面限制中,如下所示:
type AB interface { *A | *B some() bool } func some[T AB](x T) bool { return x.some() // Works }
這種方法將 T 限制為實作 some 方法的 A 或 B 類型。
但是,此解是 Go 1.18 泛型中限制的解。語言規範表明這應該是可能的,但編譯器不支援它。 Go 1.18 發行說明中已確認此限制,並記錄在問題 #51183 中。希望 Go 1.19 中刪除此限制。
以上是如何存取Go泛型聯合約束中的共享方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!