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 关注
- 129 浏览
添加回答
举报