Go 提问:值为 Nil 能调用函数吗?

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

[[442191]]

本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼。转载本文请联系脑子进煎鱼了公众号。

大家好,我是煎鱼。

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

示例

示例程序如下:

  1. type T struct{} 
  2.  
  3. func (t *T) Hello() string { 
  4.  if t == nil { 
  5.   fmt.Println("脑子进煎鱼了"
  6.   return "" 
  7.  } 
  8.  
  9.  return "煎鱼进脑子了" 
  10.  
  11. func main() { 
  12.  var t *T 
  13.  t.Hello() 

这段程序的运行结果是什么?

从程序的分析来看,变量 t 并没有初始化,只是声明了类型。然后就直接调用了 Hello 方法,像是 nil 调用函数,理论上应该出现恐慌(panic)。

运行结果是:

  1. panic: runtime error: invalid memory address or nil pointer dereference 

对不对呢?

显然,真正的运行结果是:

  1. 脑子进煎鱼了 

请你思考一下,想想这是为什么?

为什么

问题的原因是:很多小伙伴认为变量 t 的值都是 nil 了,不应该还能调用到才对。

更抽象化来讲,就是 ”程序是如何检查对象指针来寻找和调度所需函数“。

实际上,在 Go 中表达式 Expression.Name 的语法,所调用的函数完全由 Expression 的类型决定。

其调用函数的指向不是由该表达式的特定运行时值来决定,包括我们前面所提到的 nil。

具体如下:

  1. func (p *Sometype) Somemethod (firstArg int) {} 

本质上是:

  1. func SometypeSomemethod(p *Sometype, firstArg int) {} 

这么一看,其实大家应该都明白了。

上述入参 p *Sometype 是有具体上下文类型的,自然而然也就能调用到相应的方法。如果是没有任何上下文类型的,例如:nil.Somemethod 方法来调用,那肯定就是无法运行的。

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

总结

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

 

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

 

责任编辑:武晓燕 来源: 脑子进煎鱼了
相关推荐

2024-01-15 07:08:34

IsNil方法结构体

2023-10-30 08:49:23

Go提案离职

2021-11-02 12:19:18

Go函数结构

2009-08-25 10:59:00

C#调用函数显示值

2022-06-13 07:03:25

Go 语言怎么优化重

2018-11-05 14:53:14

Go函数代码

2020-12-17 06:25:05

Gopanic 模式

2022-02-28 08:11:30

gopsutil网络进程

2010-05-21 14:53:33

2023-02-26 23:36:08

PHPGo函数

2023-07-11 08:46:38

闭包函数Rust

2021-04-12 10:20:20

Java微服务Go

2015-03-13 09:36:09

NULLnullptr

2024-01-02 07:43:47

Go语言静态类型

2023-12-04 07:09:53

函数递归python

2009-12-16 14:51:26

Ruby nil

2019-01-31 01:28:13

华为

2020-11-17 15:31:23

Java微服务Go

2022-05-05 09:02:24

Go函数调用栈

2023-11-30 07:15:36

GolangRecover
点赞
收藏

51CTO技术栈公众号