gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:45:24 26 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

1年前关闭。




Improve this question




悬停在 t1.Print() 上,我的 IDE 提示:

Receiver 't' may be 'nil' in call



更详细地说:

Method calls with 'nil' receiver could lead to 'nil pointer dereference'



但是在玩弄了代码之后,我似乎无法获得 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()
}

最佳答案

您没有收到 nil 指针取消引用错误,因为此程序中没有 nil 指针。
var t1 T初始化 T 类型的值,它不是指针类型。因为 Print 方法有一个指针接收器,所以方法调用 t1.Print()自动改写为 (&t1).Print()

A method call x.m() is valid if the method set of (the type of) x contains m and the argument list can be assigned to the parameter list of m. If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m()



https://golang.org/ref/spec#Calls
&t1是*T类型,是指针类型,但指针不是nil。乍一看,这可能令人困惑,因为 t1 实际上是 nil(一个 nil slice ),但寻址一个 nil slice 是完全合法的:
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

为了引起 panic ,接收者本身必须为 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

请注意, panic 发生在方法内部,而不是调用方法的地方。这与 Java、C++、C# 等其他语言不同,在这些语言中,方法调用构成指针取消引用。在 Go 中情况并非如此。

关于go - 带有 nil 的指针函数接收器是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61950335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com