隨著Go 1.18 中泛型的引入,創建泛型資料結構成為可能,例如Either 類型,可以表示兩個可能值中的一個。這解決了傳回值和錯誤的限制,就像處理錯誤的慣用 Go 方法一樣。
實作通用 Either 類型的一種方法涉及使用 None 類型和Optional 介面。 None 表示沒有值,而Optional 提供了一種檢索值或錯誤的方法。此外,Left 和 Right 類型被定義為表示 Either 可以保存的兩個可能的值。
type Optional[T any] interface { get() (T, error) } type None[T any] struct {} type Some[T any] struct { data T }
Either 介面提供了確定它是否保存左值或右值的方法,以及存取這兩種類型的方法使用 find 方法查找值。
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] } type Left[A, B any] struct { data A } type Right[A, B any] struct { data B }
提供了幫助函數來建立Either 實例並存取它們
func left[A, B any](data A) Either[A, B] func right[A, B any](data B) Either[A, B]
以下範例示範了Either 類型的用法:
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2)
輸出將是:
left(4143) right(G4143)
透過存取is_left 和is_right方法,可以確定 Either 所持有的值的類型。使用 find_left 和 find_right 方法,可以擷取實際值。
if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } else { fmt.Fprintln(os.Stderr, err) } } if e2.is_right() { if r, err := e2.find_right().get(); err == nil { fmt.Printf("The string is: %s\n", r) } else { fmt.Fprintln(os.Stderr, err) } }
此範例示範如何使用 Either 類型以靈活且類型安全的方式表示和處理不同類型的值。
以上是如何使用 Go 的泛型來實現靈活且類型安全的任一類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!