首頁 >後端開發 >Golang >如何在 Go 2 泛型中定義遞歸類型約束?

如何在 Go 2 泛型中定義遞歸類型約束?

Patricia Arquette
Patricia Arquette原創
2024-12-27 01:35:10318瀏覽

How Can I Define a Recursive Type Constraint in Go 2 Generics?

如何使用自訂介面定義遞歸型別約束

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn