首頁 > 後端開發 > Golang > 我們如何使用泛型和可選值在 Go 中實現泛型任一類型?

我們如何使用泛型和可選值在 Go 中實現泛型任一類型?

Barbara Streisand
發布: 2024-12-24 19:55:25
原創
587 人瀏覽過

How Can We Implement a Generic Either Type in Go Using Generics and Optionals?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板