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

最近在我们 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 的设计和思考上,我们是需要清晰其背后的原因和逻辑的,也就是类型决定其调用,而不是值(容易误判)。

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

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

  1. 【代码】使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应

    import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concu ...

  2. sendrequest ajax数据返回,jquery ajax 还没有调用send()方法 返回的状态码XMLHttpRequest.status 是0 ,怎么解决?...

    jquery ajax 还没有调用send()方法 返回的状态码XMLHttpRequest.status 是0 ,怎么解决?0 嗲女错cbn2013.04.29浏览451次分享举报 function ...

  3. .net new一个类为什么报空指针_谈谈.NET对象生命周期

    不用程序员操心的堆 - 托管堆 程序在计算机上跑着,就难免会占用内存资源来存储在程序运行过程中的数据,我们按照内存资源的存取方式将内存划分为堆内存和栈内存. 栈内存通常使用的场景是:对存取速度要求较高 ...

  4. java get 空指针_Java 中空指针处理方法

    空指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常.本文介绍如何避免出现空指针异常. 首先我们看如下的示例: private Boolean isF ...

  5. java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?

    反射是 Java 的一个高级特性,大量用在各种开源框架上. 在开源框架中,往往以同一套算法,来应对不同的数据结构.比如,Spring 的依赖注入,我们不用自己 new 对象了,这工作交给 Spring ...

  6. 有没有软件能限制cpu的使用符合_电脑使用中突然黑屏是什么原因?电脑突然黑屏但是主机还运行的解决方法...

    电脑使用中突然黑屏是什么原因?电脑突然黑屏但是主机还运行的解决方法. 电脑在使用中,无论是上网还是不上网,突然之间黑屏了,屏幕显示"无信号输入",只好重新启动,而启动的时间很长,屏 ...

  7. 设计一个长方形类。成员变量包括:长度和宽度,成员函数除包括计算周长和计算面积外, 还包括用set方法来设置长方形的长度和宽度,以及用get的方法来获得长方形的长度和宽度 最后,编写一个测试程序来测试所

    本文为博主原创文章,未经博主允许不得转载. 版权为陈博超所有,第一次于2020年11月22日发表于BLOG上 本BLOG上原创文章未经本人许可,不得用于商业用途.转载请经允许后注明出处,否则保留追究法 ...

  8. 计算机点关机无法关闭主机,为什么win7电脑关不了机怎么办_win7关机主机还在运行解决方法...

    当使用完win7电脑之后,我们就需要进行及时的关机操作,防止过度消耗电脑中的硬件寿命,可是最近有的用户想要关闭自己的win7电脑时就出现了关闭不了主机还在运行的问题,那么为什么win7电脑关不了机呢? ...

  9. idea里边创建类的时候和方法自动生成注释

    我们经常写代码的时候需要在类上编写注释,标明这个类是谁写的有什么作用,其实每次写都会发现有很多相同的字段,比如作者,创建时间,类名等,有的时候方法上也要标明方法的返回值,参数等信息,在idea里边我们 ...

最新文章

  1. 设置应用图标badge(徽章)
  2. matlab多边形扫描线填充算法代码,计算机图形学—多边形扫描与填充
  3. IOS 总结:NSArray,NSSet,NSDictionary
  4. PHP实现四种基本排序算法
  5. Chrome 技术篇-json查看,json格式化,JSONView插件
  6. IDEA中双击两下shift全局搜索怎样取消和修改
  7. 投资学习网课笔记(part4)--基金第四课
  8. 深度学习(10)-- Capsules Networks(CapsNet)
  9. HUE Schedule 定时调度 - 启动时间设置问题(执行次数过多,时区问题)
  10. java 自带导出excel_4.java项目页面导出excel功能
  11. php http/1.1 403 forbidden in,http常用方法有哪些
  12. OGNL表达式【mybatis】
  13. iphone导出视频 无法连接到设备_爱思助手无法识别设备或者连接超时解决办法...
  14. mysql是如何设置候选码_求关系模式中的候选键(软考,数据库)
  15. hdu5956, The Elder (树型dp, 斜率优化)
  16. React中Mpegts播放器的使用
  17. momi's home
  18. 计算机网络-DHCP的工作原理,IP地址如何获取
  19. 恒流LED驱动芯片 SM15133EK SM15133EH 明微电子
  20. SQL:查找某个班级的人数并按班级人数多少进行排列,查找各班年龄最小的女生的班级号,学号,姓名,出生日期并按班级号升序排列

热门文章

  1. 没有桌面体验功能就不能进行图片打印
  2. PHP CodeBase: 求最近一个周一和上周一的日期
  3. 新手入门:史上最全Web端即时通讯技术原理详解
  4. 如何让HTML在手机上实现直接拨打电话以及发送短信?
  5. 热备份路由协议(HSRP)
  6. Vue项目部署遇到的问题及解决方案
  7. Python--操作数据库class
  8. CodeForces 484B Maximum Value
  9. 一个比较完善的购物车类
  10. hadoop rpc客户端初始化和调用过程详解