600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 这河里吗?Go 里边空指针还能调用对象方法!

这河里吗?Go 里边空指针还能调用对象方法!

时间:2022-06-11 01:16:41

相关推荐

这河里吗?Go 里边空指针还能调用对象方法!

本篇是煎鱼回答记者,啊不是,回答读者的提问,内容分析的不错。注意文里的读者群不是我的,我就只有公众号,以文会友,看完想走就走,赞不赞的不重要,如果想了解哪方面内容可以直接留言或者私信。

最近在我们 Go 的技术交流群里,有一个小伙伴提了一个程序方面的问题,还挺有意思的,分享给大家。

读者提问

示例

示例程序如下:

typeTstruct{}func(t*T)Hello()string{ift==nil{fmt.Println("脑子进煎鱼了")return""}return"煎鱼进脑子了"}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方法来调用,那肯定就是无法运行的。

与值是不是 nil,是什么,没有太多直接的影响。只要有预期的上下文类型就可以了。

总结

今天给大家分享了一个 Go 语言里面的一个小细节,平时可能很多人没注意到,毕竟 IDE 也会标黄,会避开这个问题点。

在理解 Go 的设计和思考上,我们是需要清晰其背后的原因和逻辑的,也就是类型决定其调用,而不是值(容易误判)。

关注煎鱼,获取业内第一手消息和知识 👇

煎鱼,Go圈网红技术博主,出版过 Go 畅销书《Go 语言编程之旅》,点击蓝字查看他的出书之路

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。