在Go 泛型中呼叫聯合約束方法
在Go 泛型(v1.18)中,您可能會遇到限制類型聯合約束的類型將參數類型轉換為實現統一介面的類型。然而,無法在受約束類型之間呼叫共享方法引起了人們對此類約束實用性的擔憂。
考慮以下程式碼:
type A struct {} type B struct {} type AB interface { *A | *B } func (a *A) some() bool { return true } func (b *B) some() bool { return false } func some[T AB](x T) bool { return x.some() } // Compiler error
編譯器錯誤「x.some undefined」是由於類型聯合約束*A | *B 不保證*A 和*B 上都存在某個方法。
要解決此問題,可以將此方法加入介面約束:
type AB interface { *A | *B; some() bool } func some[T AB](x T) bool { return x.some() } // Works
這個將 T 限制為同時實作 *A 或 *B 並宣告 some 方法的類型。
但是,此解決方案被視為理想情況下與類型聯合一起使用的解決方法 獨自的。 Go 1.18 目前存在一些限制,即僅當方法 m 由 P 的約束介面明確宣告時,編譯器才支援對型別參數 P 的值呼叫方法。儘管語言規範規定介面的方法集是介面的類型集中每種類型的方法集的交集。這個問題預計會在 Go 1.19 中解決。
以上是Go泛型的聯合約束可以在沒有明確介面宣告的情況下呼叫共享方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!