使用nil指针中的数据进行struct初始化

时间:2018-02-07 20:50:58

标签: go

当使用来自可能的'nil'指针的数据初始化结构类型时,恐慌消息总是引用调用该指针中的函数的第一行而不是值。

https://play.golang.org/p/VgX59Y08syi

例如,如果在上面的代码中交换第20行和第21行,则会在调用函数的行中发生混乱,而不是第一次取消引用nil指针。

为什么会发生这种情况,而不是“myStruct.MyString”上发生的恐慌?

1 个答案:

答案 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,则从未指定结构顺序。但是在这种情况下首先计算函数调用,就规范状态而言,在另一个版本的编译器中不能保证所提到的行为。