国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Go語(yǔ)言代碼塊與作用域理解

這篇具有很好參考價(jià)值的文章主要介紹了Go語(yǔ)言代碼塊與作用域理解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

如果不深入理解 Go 語(yǔ)言的代碼塊作用域,程序?qū)a(chǎn)生我們無(wú)法理解的行為,比如說(shuō)在循環(huán)中創(chuàng)建 goroutine func, 為什么需要傳遞參數(shù)至 goroutine 內(nèi)部,否則所有的 func 使用的變量參數(shù)都是循環(huán)的最后一個(gè)值。
看下邊這個(gè) demo, 就需要深入理解 Go 語(yǔ)言代碼塊的作用域才能理直氣壯的一口答對(duì):

func main() {
    if a := 1; false {
    } else if b := 2; false {
    } else if c := 3; false {
    } else {
        println(a, b, c)
    }
}

有兩個(gè)答案選項(xiàng):
A:1 2 3
B:無(wú)法通過(guò)編譯
思考三秒鐘??-----------------
正確答案是 A,你答對(duì)了嗎,接下來(lái)將圍繞上述例子來(lái)理解一下Go代碼塊(code block)和作用域(scope)規(guī)則,理解這些規(guī)則將有助于我們編寫出正確且可讀性高的代碼。

代碼塊與作用域簡(jiǎn)介

Go語(yǔ)言中的代碼塊是包裹在一對(duì)大括號(hào)內(nèi)部的聲明和語(yǔ)句,且代碼塊支持嵌套。如果一對(duì)大括號(hào)之間沒有任何語(yǔ)句,那么稱這個(gè)代碼塊為空代碼塊。代碼塊是代碼執(zhí)行流流轉(zhuǎn)的基本單元,代碼執(zhí)行流總是從一個(gè)代碼塊跳到另一個(gè)代碼塊。
顯示代碼塊

  • 由大括號(hào)包裹,比如函數(shù)體、for 循環(huán)的循環(huán)體、if 語(yǔ)句的某個(gè)分支等。
    image.png

隱式代碼塊

  • 宇宙代碼塊: 所有Go源碼都在該隱式代碼塊中,就相當(dāng)于所有Go代碼的最外層都存在一對(duì)大括號(hào)。
  • 包代碼塊: 每個(gè)包都有一個(gè)包代碼塊,其中放置著該包的所有Go源碼。
  • 文件代碼塊:每個(gè)文件都有一個(gè)文件代碼塊,其中包含著該文件中的所有Go源碼。
  • 每個(gè)if、for和switch語(yǔ)句均被視為位于其自己的隱式代碼塊中。
  • switch或select語(yǔ)句中的每個(gè)子句都被視為一個(gè)隱式代碼塊。

Go標(biāo)識(shí)符的作用域是基于代碼塊定義的,作用域規(guī)則描述了標(biāo)識(shí)符在哪些代碼塊中是有效的。下面是標(biāo)識(shí)符作用域規(guī)則。
在函數(shù)內(nèi)部聲明的類型標(biāo)識(shí)符的作用域范圍始于類型定義中的標(biāo)識(shí)符,止于其最里面的那個(gè)包含塊的末尾:
image.png

if 條件控制語(yǔ)句的代碼塊

  1. 單 if 型

    同時(shí)包含一個(gè)隱式代碼塊和一個(gè)顯式代碼塊:
    image.png

    func Foo() {
        if a := 1; true {
            fmt.Println(a)
        }
    }
    
    // 等價(jià)變換為
    func Foo() {
        {
            a := 1
            if true {
            	fmt.Println(a)
        	}
        }
    }
    
  2. if {} else {} 型

    包含三個(gè)代碼塊,單 if 的兩個(gè)代碼塊,else 的顯式代碼塊:
    image.png

    func Foo() {
        if a,b := 1, 2; false {
            fmt.Println(a)
        } else {
            fmt.Println(b)
        }
    }
    
    // 等價(jià)變換為
    func Foo() {
        {
            a, b := 1, 2
            if false {
                fmt.Println(a)
            } else {
            	fmt.Println(b)
        	}
        }
    }
    
  3. if {} else if {} else {} 型image.png**對(duì)上邊的偽代碼進(jìn)行變換:
    image.png
    此時(shí)就可以對(duì)一開始的答案進(jìn)行解釋了:

    func main() {
        if a := 1; false {
        } else if b := 2; false {
        } else if c := 3; false {
        } else {
            println(a, b, c)
        }
    }
    
    // 進(jìn)行等價(jià)變換后
    func main() {
        {
            a := 1
            if false {
            } else {
                {
                    b := 2
                    if false {
                    } else {
                        {
                            c := 3
                            if false {
                            } else {
                                println(a, b, c)
                            }
                        }
                    }
                }
            }
        }
    }
    

其他控制語(yǔ)句的代碼塊

  1. for 語(yǔ)句的代碼塊
    通用 for 控制語(yǔ)句等價(jià)變換:
    image.png

    for a, b := 1, 10; a < b; a++ {
        ...
    }
    
    // 等價(jià)轉(zhuǎn)換為
    {
       	a, b := 1, 10
        for ; a < b; a++ {
        	...
    	}
    }
    

    for range 語(yǔ)句等價(jià)變換:
    image.png

    var sl = []int{1, 2, 3}
    for i, n := range sl {
        ...
    }
    
    // 等價(jià)變換為
    var sl = []int{1, 2, 3}
    {
        i, n := 0, 0
        for i, n := range sl {
        	...
    	}
    }
    
  2. switch-case 語(yǔ)句的代碼塊
    通用形式等價(jià)變換:
    image.png

    switch x, y := 1, 2; x + y {
    case 3:
        a := 1
        fmt.Println("case1: a = ", a)
        fallthrough
    case 10:
        a := 5
        fmt.Println("case2: a = ", a)
        fallthrough
    default:
        a := 7
        fmt.Println("default case: a = ", a)
    }
    
    
    // 等價(jià)變換為
    {
        x, y := 1, 2
        switch x + y {
        case 3:
            {
                a := 1
                fmt.Println("case1: a = ", a)
            }
            fallthrough
        case 10:
            {
                a := 5
                fmt.Println("case2: a = ", a)
            }
            fallthrough
        default:
            {
                a := 7
                fmt.Println("default case: a = ", a)
            }
        }
    }
    
  3. select-case 語(yǔ)句的代碼塊

    通用形式等價(jià)變換:
    image.png

    c1 := make(chan int)
    c2 := make(chan int, 1)
    c2 <- 11
    select {
    case c1 <- 1:
        fmt.Println("SendStmt case has been chosen")
    case i := <-c2:
        _ = i
        fmt.Println("RecvStmt case has been chosen")
    default:
        fmt.Println("default case has been chosen")
    }
    
    // 等價(jià)變換為 (偽代碼)
    c1 := make(chan int)
    c2 := make(chan int, 1)
    c2 <- 11
    select {
    case c1 <- 1:
        {
            fmt.Println("SendStmt case has been chosen")
        }
    case "如果該case 被選擇":
        {
            i := <-c2:
            _ = i
            fmt.Println("RecvStmt case has been chosen")
        }
    default:
        {
            fmt.Println("default case has been chosen")
        }
    }
    

總結(jié)

各類隱式代碼塊的規(guī)則才是理解Go代碼塊和作用域的規(guī)則的“金鑰匙”,尤其是那些對(duì)于程序執(zhí)行流有重大影響的控制語(yǔ)句的隱式代碼塊規(guī)則。
理解Go代碼塊和作用域的規(guī)則將有助于我們快速解決類似“變量未定義”的錯(cuò)誤和上一層變量被內(nèi)層同名變量遮蔽(shadow)的問(wèn)題,同時(shí)對(duì)于正確理解Go程序的執(zhí)行流也大有裨益。

Go語(yǔ)言代碼塊與作用域理解文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-510133.html

到了這里,關(guān)于Go語(yǔ)言代碼塊與作用域理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入理解GO語(yǔ)言——GC垃圾回收二

    深入理解GO語(yǔ)言——GC垃圾回收二

    書接上回,無(wú)論怎么優(yōu)化,Go V1.3都面臨這個(gè)一個(gè)重要問(wèn)題,就是mark-and-sweep 算法會(huì)暫停整個(gè)程序 。 Go是如何面對(duì)并這個(gè)問(wèn)題的呢?接下來(lái)G V1.5版本 就用 三色并發(fā)標(biāo)記法 來(lái)優(yōu)化這個(gè)問(wèn)題 Golang中的垃圾回收主要應(yīng)用三色標(biāo)記法,GC過(guò)程和其他用戶goroutine可并發(fā)運(yùn)行,但需要一

    2024年04月11日
    瀏覽(42)
  • Go基礎(chǔ)12-理解Go語(yǔ)言表達(dá)式的求值順序

    Go語(yǔ)言在變量聲明、初始化以及賦值語(yǔ)句上相比其先祖C語(yǔ)言做了一些改進(jìn),諸如: ● 支持在同一行聲明和初始化多個(gè)變量(不同類型也可以) ● 支持在同一行對(duì)多個(gè)變量進(jìn)行賦值 這種語(yǔ)法糖在給我們帶來(lái)便利的同時(shí),也可能帶來(lái)一些令人困惑的問(wèn)題。 Go語(yǔ)言之父Rob Pike在

    2024年02月09日
    瀏覽(31)
  • 初始Go語(yǔ)言2【標(biāo)識(shí)符與關(guān)鍵字,操作符與表達(dá)式,變量、常量、字面量,變量作用域,注釋與godoc】

    ??go變量、常量、自定義類型、包、函數(shù)的命名方式必須遵循以下規(guī)則: 首字符可以是任意Unicode字符或下劃線。 首字符之外的部分可以是Unicode字符、下劃線或數(shù)字。 名字的長(zhǎng)度無(wú)限制。 理論上名字里可以有漢字,甚至可以全是漢字,但實(shí)際中不要這么做。 Go語(yǔ)言

    2023年04月09日
    瀏覽(89)
  • Go語(yǔ)言代碼斷行規(guī)則詳解

    Go語(yǔ)言代碼斷行規(guī)則詳解

    本文深入探討了Go語(yǔ)言中代碼斷行的各個(gè)方面,從基礎(chǔ)概念到實(shí)際應(yīng)用實(shí)踐。 關(guān)注【TechLeadCloud】,分享互聯(lián)網(wǎng)架構(gòu)、云服務(wù)技術(shù)的全維度知識(shí)。作者擁有10+年互聯(lián)網(wǎng)服務(wù)架構(gòu)、AI產(chǎn)品研發(fā)經(jīng)驗(yàn)、團(tuán)隊(duì)管理經(jīng)驗(yàn),同濟(jì)本復(fù)旦碩,復(fù)旦機(jī)器人智能實(shí)驗(yàn)室成員,阿里云認(rèn)證的資深架

    2024年02月08日
    瀏覽(20)
  • 掌握Go語(yǔ)言:Go語(yǔ)言范圍,優(yōu)雅遍歷數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)化代碼操作實(shí)戰(zhàn)解析(24)

    在Go語(yǔ)言中,范圍(range)用于迭代數(shù)組、切片、映射、通道等數(shù)據(jù)結(jié)構(gòu)的元素。范圍的語(yǔ)法形式為 for range ,可以遍歷集合中的每個(gè)元素,并在每次迭代中返回元素的索引(或鍵)和對(duì)應(yīng)的值。 Go語(yǔ)言范圍使用方法 使用范圍語(yǔ)句的一般形式為: 其中, index 是元素的索引(或

    2024年04月17日
    瀏覽(25)
  • Go語(yǔ)言——【高質(zhì)量編程 | 代碼規(guī)范】

    Go語(yǔ)言——【高質(zhì)量編程 | 代碼規(guī)范】

    作者 :非妃是公主 專欄 :《Golang》 博客主頁(yè) :https://blog.csdn.net/myf_666 個(gè)性簽:順境不惰,逆境不餒,以心制境,萬(wàn)事可成?!鴩?guó)藩 高質(zhì)量編程,就是指編寫的代碼能夠達(dá)到正確可靠的同時(shí),具備簡(jiǎn)潔清晰、結(jié)構(gòu)明了等特點(diǎn),可以讓團(tuán)隊(duì)成員很快的上手。具體來(lái)說(shuō),有

    2024年02月01日
    瀏覽(254)
  • 【Go 基礎(chǔ)篇】Go語(yǔ)言包詳解:模塊化開發(fā)與代碼復(fù)用

    在Go語(yǔ)言中, 包(Package) 是一種用于組織代碼的機(jī)制,用于將相關(guān)的函數(shù)、類型和變量等組織在一起,以便于模塊化開發(fā)和代碼復(fù)用。包的使用能夠使程序結(jié)構(gòu)更加清晰、可維護(hù)性更高,同時(shí)也是Go語(yǔ)言強(qiáng)調(diào)的一項(xiàng)重要特性。本篇博客將深入探討Go語(yǔ)言中包的相關(guān)知識(shí),包括

    2024年02月11日
    瀏覽(88)
  • Go語(yǔ)言用Resty庫(kù)編寫的音頻爬蟲代碼

    Go語(yǔ)言用Resty庫(kù)編寫的音頻爬蟲代碼

    目錄 一、Go語(yǔ)言與Resty庫(kù)簡(jiǎn)介 二、音頻爬蟲的實(shí)現(xiàn) 1、確定抓取目標(biāo) 2、使用Resty發(fā)送HTTP請(qǐng)求 3、解析響應(yīng)數(shù)據(jù) 4、下載音頻文件 5、并發(fā)下載音頻文件 三、注意事項(xiàng) 總結(jié) 隨著互聯(lián)網(wǎng)的飛速發(fā)展,網(wǎng)絡(luò)爬蟲逐漸成為數(shù)據(jù)獲取和分析的重要工具。在音頻領(lǐng)域,通過(guò)爬蟲技術(shù),我們

    2024年02月08日
    瀏覽(17)
  • 36-代碼測(cè)試(上):如何編寫Go語(yǔ)言單元測(cè)試和性能測(cè)試用例?

    36-代碼測(cè)試(上):如何編寫Go語(yǔ)言單元測(cè)試和性能測(cè)試用例?

    每種語(yǔ)言通常都有自己的測(cè)試包/模塊,Go語(yǔ)言也不例外。在Go中,我們可以通過(guò) testing 包對(duì)代碼進(jìn)行單元測(cè)試和性能測(cè)試。? Go語(yǔ)言有自帶的測(cè)試框架 testing ,可以用來(lái)實(shí)現(xiàn)單元測(cè)試(T類型)和性能測(cè)試(B類型),通過(guò) go test 命令來(lái)執(zhí)行單元測(cè)試和性能測(cè)試。 go test 執(zhí)行測(cè)試

    2024年04月11日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包