你如何為通用型別 T 回傳 nil
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
uj5u.com熱心網友回復:
你可以不回傳nil的任何型別。例如,如果int用作型別引數T,則回傳nil沒有意義。nil也不是結構的有效值。
您可能會做的——以及有意義的事情——是為用于 的型別引數回傳零值T。例如,零值nil用于指標、切片,它是空字串string,0用于整數和浮點數。
如何回傳零值?只需宣告一個型別的變數T,然后回傳它:
func getZero[T any]() T {
var result T
return result
}
測驗它:
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)
哪些輸出(在Go Playground上嘗試):
int 0
string ""
image.Point (0,0)
*float64 <nil>
uj5u.com熱心網友回復:
還有幾個選擇:
命名回傳型別
如果您不想顯式宣告變數,則可以使用命名回傳(盡管不是每個人都喜歡這種語法)。當您的函式體比這個人為的示例更復雜時,或者如果您需要在延遲函式體中操作值,例如重置它,這可能會派上用場:
func zero[T any]() (ret T) {
return
}
func main() {
fmt.Println(zero[int]()) // 0
fmt.Println(zero[map[string]int]()) // map[]
fmt.Println(zero[chan chan uint64]()) // <nil>
}
命名回傳的語法不可能與 var 宣告的語法非常相似。
使用您的示例:
func (list *mylist[T]) pop() (data T) {
if list.first != nil {
data = list.first.data
list.first = list.first.next
}
return
}
*T顯式回傳
當型別引數T被限制為不包括指標型別的東西時,這可能很有用。在這種情況下,您可以將回傳型別宣告為*T,現在您可以回傳nil,這是指標型別的零值。
// constraint includes only non-pointer types
func getNilFor[T constraints.Integer]() *T {
return nil
}
func main() {
fmt.Println(reflect.TypeOf(getNilFor[int]())) // *int
fmt.Println(reflect.TypeOf(getNilFor[uint64]())) // *uint64
}
注:該作品最好的時候T是不受限于任何承認指標型別,否則你得到的是一個指標到指標型別:
// pay attention to this
func zero[T any]() *T {
return nil
}
func main() {
fmt.Println(reflect.TypeOf(zero[int]())) // *int, good
fmt.Println(reflect.TypeOf(zero[*int]())) // **int, maybe not what you want...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405259.html
標籤:
