1 回答

TA貢獻1829條經驗 獲得超4個贊
您沒有收到 nil 指針取消引用錯誤,因為此程序中沒有 nil 指針。
var t1 T
初始化 type 的值T
,它不是指針類型。因為 Print 方法有一個指針接收器,所以方法調用t1.Print()
會自動重寫為(&t1).Print()
如果 x 的(類型)的方法集包含 m 并且參數列表可以分配給 m 的參數列表,則方法調用 xm() 是有效的。如果 x 是可尋址的并且 &x 的方法集包含 m,則 xm() 是 (&x).m() 的簡寫
https://golang.org/ref/spec#Calls
&t1
是*T類型,是指針類型,但指針不是nil。乍一看,這可能令人困惑,因為 t1 實際上是 nil(一個 nil 切片),但尋址一個 nil 切片是完全合法的:
type T []string
func main() {
var t1 T
fmt.Println(t1 == nil) // true (nil slice)
fmt.Println(&t1 == nil) // false (non-nil pointer to nil slice)
}
https://play.golang.org/p/i-I0PYsjLew
為了引起恐慌,接收者本身必須為 nil(而不是指向某個 nil 值):
type T []string
func (t *T) Print() {
log.Print(t)
log.Print(*t) // panic: runtime error: invalid memory address or nil pointer dereference
}
func main() {
var t1 *T // nil pointer
t1.Print()
}
https://play.golang.org/p/9whVZgeAGnI
請注意,恐慌發生在方法內部,而不是調用方法的地方。這與 Java、C++、C# 等其他語言不同,在這些語言中,方法調用構成指針取消引用。在 Go 中情況并非如此。
- 1 回答
- 0 關注
- 128 瀏覽
添加回答
舉報