为了账号安全,请及时绑定邮箱和手机立即绑定

带有 nil 的指针函数接收器是否安全?

带有 nil 的指针函数接收器是否安全?

Go
慕田峪7331174 2022-06-06 15:02:02
悬停在 上时t1.Print(),我的 IDE 抱怨:接听者“t”可能在通话中“无”更详细地说:使用“nil”接收器的方法调用可能导致“nil 指针取消引用”但是在玩弄了代码之后,我似乎无法获得nil pointer dereference error. 我错过了什么?我怎样才能导致该错误?type T []stringfunc (t *T) Print() {    log.Print(t)    log.Print(*t)    log.Print(&t)    log.Print(&(*t))}func main() {    var t1 T    t1.Print()}
查看完整描述

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 中情况并非如此。


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号