首頁 >後端開發 >Golang >如何使用 Go 的泛型來實現靈活且類型安全的任一類型?

如何使用 Go 的泛型來實現靈活且類型安全的任一類型?

Barbara Streisand
Barbara Streisand原創
2024-12-09 01:34:09228瀏覽

How Can Go's Generics Be Used to Implement a Flexible and Type-Safe Either Type?

在Go 中實現泛型Either 類型

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

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