首頁 >後端開發 >Golang >在沒有原生支援的情況下,Go 如何模仿泛型和代數資料型別?

在沒有原生支援的情況下,Go 如何模仿泛型和代數資料型別?

Barbara Streisand
Barbara Streisand原創
2024-12-13 07:58:09513瀏覽

How Can Go Mimic Generics and Algebraic Data Types Without Native Support?

Go 中沒有泛型的泛型列表

實作泛型列表

Go 本身不支援泛型,但它提供了一個使用名為Any 的空介面類型的替代方法。此介面用作任何資料類型的佔位符。

type Any interface{}

要檢查 Any 值是否為零,您可以使用 Reflect 套件檢查其基礎類型。

if reflect.ValueOf(value).IsNil() {
    // Value is nil
}

設計代數資料類型

代數資料類型,例如提供了類似 Haskell 的範例,可以使用介面在 Go 中實作。例如,要表示一個鍊錶:

type List[T Any] interface {
    Head() T
    Tail() List[T]
}

// Nil list
type Nil[T Any] struct{}

// Cons list
type Cons[T Any] struct {
    head T
    tail List[T]
}

具有特定欄位類型的物件的容器

Go 不像 Scala 那樣支援型別參數。但是,您可以建立一個類型來保證特定欄位類型的存在。

type Animal interface {
    SuitableFood() string
}

type GrassEatingAnimal struct {
    SuitableFood func() string
}

您可以透過使用通用映射來實現類似的功能:

type AnimalMap[K Comparable, V Animal] map[K]V

以上是在沒有原生支援的情況下,Go 如何模仿泛型和代數資料型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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