Go 中的泛型任一類型實現
在Go 1.18 中,泛型為表達複雜概念提供了有希望的可能性。其中一個概念是 Either 類型,它可以表示 A 類型或 B 類型的值。本文探討了在 Go 的新泛型範例中實作 Either 類型的潛在方法。
挑戰來自於 Go 對沒有型別參數的介面方法。這個障礙阻止了 Either 介面的直接實現。
使用Optional 模擬Either
一種方法是適應Option 的函數式程式設計概念。 Optional[T] 介面可以表示 T 類型的值或不存在值。透過利用Go的泛型,我們可以擴展這個想法,為A或B創建一個Optional。
type Optional[T any] interface { get() (T, error) } func CreateNone[T any]() Optional[T] { return None[T]{} } func CreateSome[T any](data T) Optional[T] { return Some[T]{data} }
實現任一
隨著Optional的建立,我們現在可以建構一個利用它的 Either 類型。
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] }
Left 和 Right 結構代表類型 A 和分別是B。 is_left 和 is_right 指示 Either 持有哪種類型。 find_left 和 find_right 為各自的值提供可選包裝器。
type Left[A, B any] struct { data A } func left[A, B any](data A) Either[A, B] { return Left[A, B]{data} } type Right[A, B any] struct { data B } func right[A, B any](data B) Either[A, B] { return Right[A, B]{data} }
用法
實現的Either 類型可以如下使用:
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } }
這種方法有效地模擬了Either 類型,同時尊重Go 的介面約束。它允許表達可能屬於兩種類型之一的值,從而在 Go 程式碼中提供更大的靈活性和類型安全性。
以上是我們如何使用泛型和可選值在 Go 中實現泛型任一類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!