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

悬停在 上时t1.Print(),我的 IDE 抱怨:

接听者“t”可能在通话中“无”

更详细地说:

使用“nil”接收器的方法调用可能导致“nil 指针取消引用”

但是在玩弄了代码之后,我似乎无法获得nil pointer dereference error. 我错过了什么?我怎样才能导致该错误?

type T []string


func (t *T) Print() {

    log.Print(t)

    log.Print(*t)

    log.Print(&t)

    log.Print(&(*t))

}


func main() {

    var t1 T

    t1.Print()

}


慕田峪7331174
浏览 130回答 1
1回答

浮云间

您没有收到 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 []stringfunc 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 []stringfunc (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 中情况并非如此。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go