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

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

Linda Hamilton
發布: 2024-12-19 02:24:09
原創
965 人瀏覽過

How to Return Default Values for Generic Types in Go?

在 Go 中傳回泛型型別的預設值

在 Go 中,如何傳回泛型型別 T 的預設值?考慮以下程式碼:

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

type node[T any] struct {
    data T
    next *node[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
}
登入後複製

嘗試編譯此程式碼時,您可能會遇到錯誤:

cannot use nil as T value in return statement
登入後複製

傳回Nil 的問題

Go 中不允許為泛型類型傳回nil。這是因為 nil 並不是所有類型的有效值。例如,如果 T 是整數,則傳回 nil 將毫無意義。同樣,nil 也不是結構體的有效值。

傳回零值

您應該傳回用於的型別參數的零值,而不是傳回nil T.指標和切片的零值為nil,字串的零值為空字串,整數和浮點數的零值為0

要傳回零值,您可以宣告 T類型的變數並回傳它:

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

測試零值函數

這是一個如何測試getZero 的範例函數:

package main

import "fmt"

func main() {
    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>
登入後複製

這表示getZero函數傳回不同類型的預期零值。

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

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