当使用来自可能的'nil'指针的数据初始化结构类型时,恐慌消息总是引用调用该指针中的函数的第一行而不是值。
https://play.golang.org/p/VgX59Y08syi
例如,如果在上面的代码中交换第20行和第21行,则会在调用函数的行中发生混乱,而不是第一次取消引用nil指针。
为什么会发生这种情况,而不是“myStruct.MyString”上发生的恐慌?
答案 0 :(得分:1)
通过将func (m *MyStruct) Sent() bool {
(指针接收器)更改为func (m MyStruct) Sent() bool {
(值接收器),您可以看到堆栈跟踪已从
goroutine 1 [running]:
main.(*MyStruct).Sent(...)
/tmp/sandbox520127412/main.go:14
main.main()
/tmp/sandbox520127412/main.go:21 +0x1a
到
goroutine 1 [running]:
main.MyStruct.Sent(...)
/tmp/sandbox497151564/main.go:21
main.main()
/tmp/sandbox497151564/main.go:21 +0x1a
告诉我们golang对待指针接收器的方式不同。
如果选中https://golang.org/ref/spec#Order_of_evaluation,则从未指定结构顺序。但是在这种情况下首先计算函数调用,就规范状态而言,在另一个版本的编译器中不能保证所提到的行为。