我是一個新手 Go 程式員,對以下行為感到困惑。我預計程式會t2
因錯誤而失敗
append 的第一個引數必須是切片;有無型別 nil
但是當它是方法的引數時,Go 很高興將 nil 作為第一個引數傳遞給 append 嗎?
package main
import "fmt"
type Thing struct {
data []string
}
func NewThing(extra []string) Thing {
return Thing{
data: append(extra, "b"),
}
}
func main() {
t := NewThing([]string{"a"})
fmt.Println(t.data) // [a b]
t2 := NewThing(nil)
fmt.Println(t2.data) // [b]
//_ = Thing{ // build failed: first argument to append must be a slice; have untyped nil
// data: append(nil, "b"),
//}
}
游樂場:https ://go.dev/play/p/Cxi7fRHu3Wi
這只是一個便利功能還是我理解錯了?
uj5u.com熱心網友回復:
nil slice 的容量和長度為零是很方便的。從那里開始,當傳遞一個 nil 切片時,追加作業正常。
該呼叫append(nil, "b")
無法編譯,因為nil
沒有型別。編譯器無法確定結果的型別,因為 slice 引數沒有型別。
append(extra, "b")
當extra
isnil
是extra
一個型別化的值 (a ) 時呼叫有效[]string
。給定切片型別,編譯器知道結果是[]string
并且附加的元素必須可分配給string
。
該呼叫append([]string(nil), "b")
也有效,因為運算式[]string(nil)
是一個型別化的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493489.html