在 Go2 泛型中,您可以使用介面來約束泛型類型,確保它實作特定方法。然而,目前草案中不允許強制實作帶有泛型類型參數的方法。
引入解決方案:
新草案允許定義Lesser 介面和IsLess函數為:
type Lesser[T any] interface { Less(T) bool } func IsLess[T Lesser[T]](x, y T) bool { return x.Less(y) }
此解決方案強制T 必須是實作Lesser 介面的類型,這需要一個Less 方法採用T 類型的參數。透過定義約束 T Lesser[T],我們建立了一個遞歸類型約束。
實際範例:
type Apple int func (a Apple) Less(other Apple) bool { return a < other } type Orange int func (o Orange) Less(other Orange) bool { return o < other } func main() { fmt.Println(IsLess(Apple(10), Apple(20))) // true fmt.Println(IsLess(Orange(30), Orange(15))) // false }
在此範例中,自訂類型 Apple 和 Orange兩者都符合 Lesser 要求並且可以傳遞給 IsLess。但是,傳遞 int 或混合類型(例如 Apple 和 Orange)將因類型約束而導致編譯錯誤。
結論:
此解決方案允許使用定義的介面進行遞歸類型約束在新的 Go2 泛型草案中,允許您強制泛型類型及其方法之間的複雜關係。
以上是如何在 Go 2 泛型中定義遞歸類型約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!