首頁 > 後端開發 > Golang > 如何處理 Go 中泛型類型的預設值回傳?

如何處理 Go 中泛型類型的預設值回傳?

Barbara Streisand
發布: 2024-12-31 18:57:22
原創
533 人瀏覽過

How Can I Handle Default Value Returns for Generic Types in Go?

在Go 中實作泛型類型的預設值回傳

在Go 中,語言中缺少null 值在傳回空值或預設值時帶來了挑戰泛型類型。

Nil 回傳的限制

考慮以下泛型列表實作:

type mylist[T any] struct {
    first *node[T]
}

type node[T any] struct {
    data T
    next *next[T]
}
登入後複製

在這個例子中,我們可以定義從列表中彈出和檢索第一個元素的方法:

func (list *mylist[T]) pop() T {
    if list.first != nil {
        data := list.first.data
        list.first = list.first.next
        return data
    }
    return nil
}

func (list *mylist[T]) getfirst() T {
    if list.first != nil {
        return list.first.data
    }
    return nil
}
登入後複製

但是,在編譯此程式碼時,編譯器會引發錯誤:「不能在return 語句中使用nil 作為 T 值。

解:傳回零值

我們可以為所使用的特定型別 T 傳回零值,而不是傳回 nil在通用列表中。零值為:

  • 指標為Nil
  • 字串為空字串
  • 整數和浮點數為0

為了整數與浮點數為0

func getZero[T any]() T {
    var result T
    return result
}
登入後複製

為了實現這一點,我們可以聲明一個 T類型的變數並傳回it:

i := getZero[int]()
fmt.Printf("%T %v\n", i, i)

s := getZero[string]()
fmt.Printf("%T %q\n", s, s)

p := getZero[image.Point]()
fmt.Printf("%T %v\n", p, p)

f := getZero[*float64]()
fmt.Printf("%T %v\n", f, f)
登入後複製

此函數現在可用於傳回任何泛型類型的零值。例如,我們可以針對不同類型對其進行測試:

int 0
string ""
image.Point (0,0)
*float64 <nil>
登入後複製

輸出:

此解決方案可讓您為Go 中的任何泛型類型傳回正確的默認值或空值。

以上是如何處理 Go 中泛型類型的預設值回傳?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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