成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 提問:值為 Nil 能調(diào)用函數(shù)嗎?

開發(fā) 后端
今天給大家分享了一個 Go 語言里面的一個小細(xì)節(jié),平時可能很多人沒注意到,畢竟 IDE 也會標(biāo)黃,會避開這個問題點(diǎn)。

[[442191]]

本文轉(zhuǎn)載自微信公眾號「腦子進(jìn)煎魚了」,作者陳煎魚。轉(zhuǎn)載本文請聯(lián)系腦子進(jìn)煎魚了公眾號。

大家好,我是煎魚。

最近在我們 Go 的技術(shù)交流群里,有一個小伙伴提了一個程序方面的問題,還挺有意思的,分享給大家。

示例

示例程序如下:

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

這段程序的運(yùn)行結(jié)果是什么?

從程序的分析來看,變量 t 并沒有初始化,只是聲明了類型。然后就直接調(diào)用了 Hello 方法,像是 nil 調(diào)用函數(shù),理論上應(yīng)該出現(xiàn)恐慌(panic)。

運(yùn)行結(jié)果是:

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

對不對呢?

顯然,真正的運(yùn)行結(jié)果是:

  1. 腦子進(jìn)煎魚了 

請你思考一下,想想這是為什么?

為什么

問題的原因是:很多小伙伴認(rèn)為變量 t 的值都是 nil 了,不應(yīng)該還能調(diào)用到才對。

更抽象化來講,就是 ”程序是如何檢查對象指針來尋找和調(diào)度所需函數(shù)“。

實(shí)際上,在 Go 中表達(dá)式 Expression.Name 的語法,所調(diào)用的函數(shù)完全由 Expression 的類型決定。

其調(diào)用函數(shù)的指向不是由該表達(dá)式的特定運(yùn)行時值來決定,包括我們前面所提到的 nil。

具體如下:

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

本質(zhì)上是:

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

這么一看,其實(shí)大家應(yīng)該都明白了。

上述入?yún)?p *Sometype 是有具體上下文類型的,自然而然也就能調(diào)用到相應(yīng)的方法。如果是沒有任何上下文類型的,例如:nil.Somemethod 方法來調(diào)用,那肯定就是無法運(yùn)行的。

與值是不是 nil,是什么,沒有太多直接的影響。只要有預(yù)期的上下文類型就可以了。

總結(jié)

今天給大家分享了一個 Go 語言里面的一個小細(xì)節(jié),平時可能很多人沒注意到,畢竟 IDE 也會標(biāo)黃,會避開這個問題點(diǎn)。

 

在理解 Go 的設(shè)計(jì)和思考上,我們是需要清晰其背后的原因和邏輯的,也就是類型決定其調(diào)用,而不是值(容易誤判)。

 

責(zé)任編輯:武曉燕 來源: 腦子進(jìn)煎魚了
相關(guān)推薦

2024-01-15 07:08:34

IsNil方法結(jié)構(gòu)體

2023-10-30 08:49:23

Go提案離職

2021-11-02 12:19:18

Go函數(shù)結(jié)構(gòu)

2009-08-25 10:59:00

C#調(diào)用函數(shù)顯示值

2022-06-13 07:03:25

Go 語言怎么優(yōu)化重

2025-02-18 11:15:12

2010-05-21 14:53:33

2020-12-17 06:25:05

Gopanic 模式

2023-02-26 23:36:08

PHPGo函數(shù)

2022-02-28 08:11:30

gopsutil網(wǎng)絡(luò)進(jìn)程

2018-11-05 14:53:14

Go函數(shù)代碼

2025-02-24 09:30:15

2015-03-13 09:36:09

NULLnullptr

2021-04-12 10:20:20

Java微服務(wù)Go

2023-07-11 08:46:38

閉包函數(shù)Rust

2024-01-02 07:43:47

Go語言靜態(tài)類型

2019-01-31 01:28:13

華為

2009-12-16 14:51:26

Ruby nil

2023-11-30 07:15:36

GolangRecover

2023-12-04 07:09:53

函數(shù)遞歸python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美在线视频一区二区 | 综合国产第二页 | 国产精品高潮呻吟久久av野狼 | 国产69精品久久久久777 | 欧美激情五月 | 欧美国产视频一区二区 | 亚洲免费观看视频 | 伊人青青久久 | 成人毛片在线视频 | 日韩成人免费在线视频 | 亚洲视频二区 | 日韩成人一区 | 在线91| 国内精品伊人久久久久网站 | 视频1区 | 国产精品日韩欧美一区二区三区 | 免费一区 | 色综合久久88色综合天天 | 国产精品日韩欧美一区二区 | 欧美成人精品一区二区三区 | 欧美日韩一区二区视频在线观看 | 亚洲一区二区三区四区五区午夜 | 二区高清| 日本精品一区二区三区在线观看 | 欧美精品啪啪 | 精品久久久久久久久久久久久久 | 日日干日日 | 综合伊人 | 中文字幕一区在线观看视频 | 久久久久久国产精品免费免费 | 久久中文字幕视频 | 日本一区不卡 | www.亚洲成人网 | 久久机热 | 亚洲精品乱码久久久久久按摩观 | 久久久综合 | 国产精品视频网 | 婷婷精品| 久久久久久久久久久久久久久久久久久久 | 最新超碰 | 亚洲成人二区 |