这河里吗?Go 里边空指针还能调用对象方法!
本篇是煎鱼回答记者,啊不是,回答读者的提问,内容分析的不错。注意文里的读者群不是我的,我就只有公众号,以文会友,看完想走就走,赞不赞的不重要,如果想了解哪方面内容可以直接留言或者私信。
最近在我们 Go 的技术交流群里,有一个小伙伴提了一个程序方面的问题,还挺有意思的,分享给大家。
示例
示例程序如下:
type T struct{}func (t *T) Hello() string {if t == nil {fmt.Println("脑子进煎鱼了")return ""}return "煎鱼进脑子了"
}func main() {var t *Tt.Hello()
这段程序的运行结果是什么?
从程序的分析来看,变量 t
并没有初始化,只是声明了类型。然后就直接调用了 Hello
方法,像是 nil 调用函数,理论上应该出现恐慌(panic)。
运行结果是:
panic: runtime error: invalid memory address or nil pointer dereference
对不对呢?
显然,真正的运行结果是:
脑子进煎鱼了
请你思考一下,想想这是为什么?
为什么
问题的原因是:很多小伙伴认为变量 t
的值都是 nil 了,不应该还能调用到才对。
更抽象化来讲,就是 ”程序是如何检查对象指针来寻找和调度所需函数“。
实际上,在 Go 中表达式 Expression.Name
的语法,所调用的函数完全由 Expression
的类型决定。
其调用函数的指向不是由该表达式的特定运行时值来决定,包括我们前面所提到的 nil。
具体如下:
func (p *Sometype) Somemethod (firstArg int) {}
本质上是:
func SometypeSomemethod(p *Sometype, firstArg int) {}
这么一看,其实大家应该都明白了。
上述入参 p *Sometype
是有具体上下文类型的,自然而然也就能调用到相应的方法。如果是没有任何上下文类型的,例如:nil.Somemethod
方法来调用,那肯定就是无法运行的。
与值是不是 nil,是什么,没有太多直接的影响。只要有预期的上下文类型就可以了。
总结
今天给大家分享了一个 Go 语言里面的一个小细节,平时可能很多人没注意到,毕竟 IDE 也会标黄,会避开这个问题点。
在理解 Go 的设计和思考上,我们是需要清晰其背后的原因和逻辑的,也就是类型决定其调用,而不是值(容易误判)。
关注煎鱼,获取业内第一手消息和知识
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concu ... jquery ajax 还没有调用send()方法 返回的状态码XMLHttpRequest.status 是0 ,怎么解决?0 嗲女错cbn2013.04.29浏览451次分享举报 function ... 不用程序员操心的堆 - 托管堆 程序在计算机上跑着,就难免会占用内存资源来存储在程序运行过程中的数据,我们按照内存资源的存取方式将内存划分为堆内存和栈内存. 栈内存通常使用的场景是:对存取速度要求较高 ... 空指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常.本文介绍如何避免出现空指针异常. 首先我们看如下的示例: private Boolean isF ... 反射是 Java 的一个高级特性,大量用在各种开源框架上. 在开源框架中,往往以同一套算法,来应对不同的数据结构.比如,Spring 的依赖注入,我们不用自己 new 对象了,这工作交给 Spring ... 电脑使用中突然黑屏是什么原因?电脑突然黑屏但是主机还运行的解决方法. 电脑在使用中,无论是上网还是不上网,突然之间黑屏了,屏幕显示"无信号输入",只好重新启动,而启动的时间很长,屏 ... 本文为博主原创文章,未经博主允许不得转载. 版权为陈博超所有,第一次于2020年11月22日发表于BLOG上 本BLOG上原创文章未经本人许可,不得用于商业用途.转载请经允许后注明出处,否则保留追究法 ... 当使用完win7电脑之后,我们就需要进行及时的关机操作,防止过度消耗电脑中的硬件寿命,可是最近有的用户想要关闭自己的win7电脑时就出现了关闭不了主机还在运行的问题,那么为什么win7电脑关不了机呢? ... 我们经常写代码的时候需要在类上编写注释,标明这个类是谁写的有什么作用,其实每次写都会发现有很多相同的字段,比如作者,创建时间,类名等,有的时候方法上也要标明方法的返回值,参数等信息,在idea里边我们 ...这河里吗?Go 里边空指针还能调用对象方法!相关推荐
最新文章
热门文章