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 中解決。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3