最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為什么Go里值為nil可以調(diào)用函數(shù)原理分析

 更新時(shí)間:2023年08月07日 08:56:27   作者:煎魚  
這篇文章主要為大家介紹了為什么Go里值為nil可以調(diào)用函數(shù)原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

起因

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

示例

示例程序如下:

type T struct{}
func (t *T) Hello() string {
    if t == nil {
        fmt.Println("腦子進(jìn)煎魚了")
        return ""
    }
    return "煎魚進(jìn)腦子了"
}
func main() {
    var t *T
    t.Hello()

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

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

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

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

對(duì)不對(duì)呢?

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

腦子進(jìn)煎魚了

請(qǐng)你思考一下,想想這是為什么?

原理

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

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

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

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

具體如下:

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

本質(zhì)上是:

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

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

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

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

總結(jié)

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

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

以上就是為什么Go里值為nil可以調(diào)用函數(shù)原理分析的詳細(xì)內(nèi)容,更多關(guān)于Go值nil調(diào)用函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼

    Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼

    這篇文章主要介紹了Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 關(guān)于golang?struct?中的?slice?無法原子賦值的問題

    關(guān)于golang?struct?中的?slice?無法原子賦值的問題

    這篇文章主要介紹了為什么?golang?struct?中的?slice?無法原子賦值的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • GO語言包管理工具go?mod以及包詳解

    GO語言包管理工具go?mod以及包詳解

    go mod是go的一個(gè)模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于GO語言包管理工具go?mod以及包詳解的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Go素?cái)?shù)篩選分析詳解

    Go素?cái)?shù)篩選分析詳解

    學(xué)習(xí)Go語言的過程中,遇到素?cái)?shù)篩選的問題。這是一個(gè)經(jīng)典的并發(fā)編程問題,是某大佬的代碼,短短幾行代碼就實(shí)現(xiàn)了素?cái)?shù)篩選,這篇文章主要介紹了Go素?cái)?shù)篩選分析,需要的朋友可以參考下
    2022-10-10
  • Golang實(shí)現(xiàn)密碼加密的示例詳解

    Golang實(shí)現(xiàn)密碼加密的示例詳解

    數(shù)據(jù)庫在存儲(chǔ)密碼時(shí),不能明文存儲(chǔ),需要加密后存儲(chǔ),而Golang中的加密算法有很多種,下面小編就來通過簡單的示例和大家簡單聊聊吧
    2023-07-07
  • Go語言的連接池管理的具體使用

    Go語言的連接池管理的具體使用

    這篇文章主要介紹了Go語言的連接池管理的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • golang 微服務(wù)之gRPC與Protobuf的使用

    golang 微服務(wù)之gRPC與Protobuf的使用

    這篇文章主要介紹了golang 微服務(wù)之gRPC與Protobuf的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Go語言Grpc?Stream的實(shí)現(xiàn)

    Go語言Grpc?Stream的實(shí)現(xiàn)

    本文主要介紹了Go語言Grpc?Stream的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Golang實(shí)現(xiàn)并發(fā)安全帶過期清理的緩存結(jié)構(gòu)

    Golang實(shí)現(xiàn)并發(fā)安全帶過期清理的緩存結(jié)構(gòu)

    本文主要介紹了Golang實(shí)現(xiàn)并發(fā)安全帶過期清理的緩存結(jié)構(gòu),采用RWMutex保障并發(fā),定時(shí)清理與惰性刪除處理過期,分片優(yōu)化性能,應(yīng)對(duì)緩存雪崩和穿透,感興趣的可以了解一下
    2025-06-06
  • golang優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)全過程

    golang優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)全過程

    優(yōu)先級(jí)隊(duì)列是一種特殊隊(duì)列,下面這篇文章主要給大家介紹了關(guān)于golang優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)全過程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12

最新評(píng)論

黑龙江省| 黔西| 杨浦区| 五常市| 芦溪县| 英德市| 大关县| 广河县| 刚察县| 台南县| 高安市| 大冶市| 莱西市| 梅河口市| 呼玛县| 苏尼特左旗| 杭锦旗| 龙井市| 习水县| 泌阳县| 慈溪市| 新巴尔虎右旗| 布尔津县| 阜新| 乌兰县| 崇左市| 浪卡子县| 那坡县| 梁平县| 新巴尔虎左旗| 石景山区| 广南县| 枣强县| 宜章县| 吐鲁番市| 珠海市| 内丘县| 临安市| 天峨县| 特克斯县| 涡阳县|