当前位置: 首页 > 后端技术 > PHP

为什么在Go中可以调用值为nil的函数?

时间:2023-03-30 01:25:41 PHP

大家好,我是炸鱼。最近在我们的围棋技术交流群里,有小伙伴提了一个程序相关的问题,挺有意思的,分享给大家。示例示例程序如下:typeTstruct{}func(t*T)Hello()string{ift==nil{fmt.Println("Thebrainisfriedfish")return""}return"Thefriedfishhasintothebrain"}funcmain(){vart*Tt.Hello()这个程序的结果是什么?从程序分析,变量t并没有被初始化,只是声明了类型。然后直接调用hello方法,就像用nil调用函数一样,理论上应该会出现panic(恐慌)。运行结果是:panic:runtimeerror:invalidmemoryaddressornilpointerdereference,对吧?显然,真正的操作结果是:你脑子炸了,请你想想,想想这是为什么?问题原因是:很多朋友认为变量t的值为nil,不应该调用。更抽象地说,就是“程序如何通过检查对象指针来找到并派发需要的函数”。其实在Go中,表达式Expression.Name的语法,调用的函数完全由Expression的类型决定。指向调用函数的指针不是由表达式的具体运行时值决定的,包括我们前面提到的nil。具体如下:func(p*Sometype)Somemethod(firstArgint){}本质上就是:funcSometypeSomemethod(p*Sometype,firstArgint){}这样看,大家应该就明白了。上面的入参p*Sometype有特定的上下文类型,自然可以调用相应的方法。如果在没有任何上下文类型的情况下调用它,例如:nil.Somemethod方法,它肯定不会起作用。对值是多少没有太大的直接影响,无论它是否为零。只要有预期类型的??上下文就可以了。小结今天给大家分享一个Go语言的小细节。很多人可能没有注意到。毕竟IDE也会把它标记为黄色,避免这个问题。在理解Go的设计和思路时,我们需要明确其背后的原因和逻辑,即类型决定其调用,而不是值(容易误判)。您是否遇到过任何其他详细问题?欢迎交流:)如有任何问题,欢迎在评论区反馈交流。最好的关系是相互成就。您的好评是炸鱼创作最大的动力。感谢您的支持。文章持续更新中。可以微信搜索【脑补炸鱼】阅读。本文已收录在GitHubgithub.com/eddycjy/blog中。学习Go语言可以看Go学习地图和路线。欢迎星星提醒。