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