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

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

Barbara Streisand
發布: 2024-12-13 07:58:09
原創
518 人瀏覽過

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

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