1. Go 語(yǔ)言基礎(chǔ) - if-else

        共 1760字,需瀏覽 4分鐘

         ·

        2022-04-14 12:21

        點(diǎn)擊上方“Go語(yǔ)言進(jìn)階學(xué)習(xí)”,進(jìn)行關(guān)注

        回復(fù)“Go語(yǔ)言”即可獲贈(zèng)從入門到進(jìn)階共10本電子書(shū)

        更有明朝恨,離杯惜共傳。

        你好,我是四哥。

        上篇文章我們學(xué)習(xí)了包的用法,這篇文章來(lái)學(xué)習(xí) if-else 語(yǔ)句。

        if 是一個(gè)具有布爾條件的語(yǔ)句,如果該條件的計(jì)算結(jié)果為 true,將會(huì)執(zhí)行 if 后面大括號(hào)里的代碼,如果結(jié)果為 false,則會(huì)執(zhí)行 else 后大括號(hào)里的代碼。

        通過(guò)這篇文章,我們會(huì)學(xué)習(xí)了解 if 語(yǔ)句的各種語(yǔ)法和使用方法。

        if 語(yǔ)法

        if 語(yǔ)句的語(yǔ)法如下所示:

        if?condition?{
        }

        如果判斷 condition 為 true,則執(zhí)行大括號(hào) {} 之間的代碼。

        與 C 等其他語(yǔ)言不同,大括號(hào) {} 是強(qiáng)制性的,即使大括號(hào)之間只有一行代碼。

        示例

        讓我們編寫一個(gè)簡(jiǎn)單的程序來(lái)判斷一個(gè)數(shù)字是偶數(shù)還是奇數(shù)。

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????num?:=?10
        ????if?num%2?==?0?{?//checks?if?number?is?even
        ????????fmt.Println("The?number",?num,?"is?even")
        ????????return
        ????}
        ????fmt.Println("The?number",?num,?"is?odd")
        }

        執(zhí)行[1]

        上面代碼第 9 行 num%2 判斷 num 除以 2 余數(shù)是否為 0,因?yàn)?num 次數(shù)偶數(shù),所以余數(shù)為 0,程序輸出 The number 10 is even。

        if-else 語(yǔ)句

        if 語(yǔ)句有對(duì)應(yīng)的 else 分支,如果 condition 結(jié)果為 false,則會(huì)執(zhí)行 else 分支。

        if?condition?{
        }?else?{
        }

        在上面的代碼,如果 condition 結(jié)果為 false,則 else 分支 {} 之間的代碼行將被執(zhí)行。

        讓我們使用 if-else 語(yǔ)句重寫程序來(lái)判斷數(shù)字是奇數(shù)還是偶數(shù)。

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????num?:=?11
        ????if?num%2?==?0?{?//checks?if?number?is?even
        ????????fmt.Println("the?number",?num,?"is?even")
        ????}?else?{
        ????????fmt.Println("the?number",?num,?"is?odd")
        ????}
        }

        執(zhí)行[2]

        上面的代碼中,我們沒(méi)有在條件為 true 時(shí)直接返回,而是創(chuàng)建了 else 語(yǔ)句,當(dāng)條件為 false 時(shí),將執(zhí)行該語(yǔ)句。在我們這個(gè) case 中,由于 11 是奇數(shù),因此 if 條件為 false,所以會(huì)執(zhí)行 else 語(yǔ)句中的代碼。

        上面代碼執(zhí)行輸出:

        the?number?11?is?odd

        if-else if-else 語(yǔ)句

        if 語(yǔ)句不僅有 else 分支,還可以有 else-if 分支,語(yǔ)法如下:

        if?condition1?{
        ...
        }?else?if?condition2?{
        ...
        }?else?{
        ...
        }

        代碼執(zhí)行時(shí)會(huì)從上之下判斷每個(gè)分支的 condition 是否為 true。

        上面的代碼,如果 condition1 為 true,將會(huì)執(zhí)行 condition1 后面 {} 之間的代碼;

        如果 condition1 為 false 且 condition2 為 true,則會(huì)執(zhí)行 condition2 后面 {} 之間的代碼;

        如果 condition1 和 condition2 都為 false,則會(huì)執(zhí)行 else 后面 {} 之間的代碼。

        可以有任意數(shù)量的 else-if 語(yǔ)句塊。

        通常,只要 if 和 else-if 語(yǔ)句有一個(gè) condition 為 true,就會(huì)執(zhí)行相應(yīng)的代碼塊,如果沒(méi)有為 true 的情況則會(huì)執(zhí)行 else 分支的代碼。

        我們使用 else-if 語(yǔ)句編寫一段程序:

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????num?:=?99
        ????if?num?<=?50?{
        ????????fmt.Println(num,?"is?less?than?or?equal?to?50")
        ????}?else?if?num?>=?51?&&?num?<=?100?{
        ????????fmt.Println(num,?"is?between?51?and?100")
        ????}?else?{
        ????????fmt.Println(num,?"is?greater?than?100")
        ????}
        }

        執(zhí)行[3]

        上面的代碼,else if num >= 51 && num <= 100 條件為 true,所以執(zhí)行輸出:

        99?is?between?51?and?100

        if 包含初始化語(yǔ)句

        if 語(yǔ)句的一種變體是在判斷條件之前,可以有短變量聲明語(yǔ)句,語(yǔ)法如下:

        if?assignment-statement;?condition?{
        }

        上面的代碼片段,短變量聲明語(yǔ)句會(huì)優(yōu)先執(zhí)行。

        我們用上面的語(yǔ)法重寫代碼來(lái)判斷數(shù)字是偶數(shù)還是奇數(shù)。

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????if?num?:=?10;?num?%?2?==?0?{?//checks?if?number?is?even
        ????????fmt.Println(num,"is?even")
        ????}??else?{
        ????????fmt.Println(num,"is?odd")
        ????}
        }

        執(zhí)行[4]

        上面代碼第 8 行,變量 num 在 if 語(yǔ)句中被初始化,

        需要注意的是,num 的作用域僅限于 if-else 語(yǔ)句塊內(nèi),即如果我們?cè)?if-else 之外訪問(wèn) num,編譯器將會(huì)報(bào)錯(cuò)

        當(dāng)我們僅僅想聲明一個(gè)只在 if-else 內(nèi)部使用的變量時(shí),這種語(yǔ)法就可以派上用場(chǎng),可確保變量的作用范圍僅在 if-else 語(yǔ)句內(nèi)。

        else 語(yǔ)句應(yīng)該在 if 語(yǔ)句的右大括號(hào) } 之后的同一行開(kāi)始。如果不是,會(huì)編譯報(bào)錯(cuò)。

        寫一小段程序理解下:

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????num?:=?10
        ????if?num?%?2?==?0?{?//checks?if?number?is?even
        ????????fmt.Println("the?number?is?even")
        ????}
        ????else?{
        ????????fmt.Println("the?number?is?odd")
        ????}
        }

        執(zhí)行[5]

        上面代碼的第 11 行,else 語(yǔ)句沒(méi)有緊跟著 if 語(yǔ)句的 } 后面 ,相反,它是另起新的一行開(kāi)始。如果你執(zhí)行程序編譯器將會(huì)報(bào)錯(cuò)。

        ./prog.go:12:5:?syntax?error:?unexpected?else,?expecting?}

        報(bào)錯(cuò)的原因在于 Go 會(huì)自動(dòng)插入分號(hào),關(guān)于插入分號(hào)的規(guī)則可以點(diǎn)擊這里[6]查看更多信息。

        其中有一項(xiàng)規(guī)則,如果一行代碼以 } 結(jié)束,則會(huì)在 } 后面自動(dòng)加上分號(hào),所以上面代碼第 11 行,會(huì)被編譯器在 } 后面自動(dòng)加上分號(hào)。

        我們的代碼就變成了:

        ...
        if?num%2?==?0?{
        ??????fmt.Println("the?number?is?even")
        };??//semicolon?inserted?by?Go?Compiler
        else?{
        ??????fmt.Println("the?number?is?odd")
        }

        由于 if-else 是一個(gè)獨(dú)立的語(yǔ)句,中間不應(yīng)出現(xiàn)分號(hào),因此,程序編譯會(huì)報(bào)錯(cuò)。因此,將 else 緊跟在 if 語(yǔ)句的右大括號(hào) } 之后是語(yǔ)法要求。

        正確格式的代碼如下:

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????num?:=?10
        ????if?num%2?==?0?{?//checks?if?number?is?even
        ????????fmt.Println("the?number?is?even")
        ????}?else?{
        ????????fmt.Println("the?number?is?odd")
        ????}
        }

        執(zhí)行[7]

        Go 里的習(xí)慣用法

        我們已經(jīng)學(xué)習(xí)了各種 if-else 語(yǔ)句,針對(duì)同一功能可以用這些不同語(yǔ)句編寫出不同的實(shí)現(xiàn)方法。例如,我們使用 if-else 語(yǔ)句及其變體實(shí)現(xiàn)了不同的方式去判斷一個(gè)數(shù)字是奇數(shù)還是偶數(shù)。你可能會(huì)問(wèn),哪種方式才是 Go 語(yǔ)言常用的方式呢?

        在 Go 的設(shè)計(jì)哲學(xué)中,最好避免不必要的分支和代碼縮進(jìn)。執(zhí)行時(shí)盡早返回也被認(rèn)為是更好的。

        再來(lái)展示下之前的代碼:

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????if?num?:=?10;?num?%?2?==?0?{?//checks?if?number?is?even
        ????????fmt.Println(num,"is?even")
        ????}??else?{
        ????????fmt.Println(num,"is?odd")
        ????}
        }

        按照 Go 語(yǔ)言的設(shè)計(jì)哲學(xué)該如何編寫上述的代碼呢?應(yīng)該盡量避免 else 分支;如果 if 語(yǔ)句的條件為 true,則應(yīng)盡早執(zhí)行 return 返回。

        就像下面這樣:

        package?main

        import?(
        ????"fmt"
        )

        func?main()?{
        ????num?:=?10;
        ????if?num%2?==?0?{?//checks?if?number?is?even
        ????????fmt.Println(num,?"is?even")
        ????????return
        ????}
        ????fmt.Println(num,?"is?odd")

        }

        執(zhí)行[8]

        在上面代碼中,一旦我們發(fā)現(xiàn)數(shù)字是偶數(shù),就立即返回,就避免了不必要的 else 分支。這就是 Go 語(yǔ)言的哲學(xué) -- “大道至簡(jiǎn)”,盡量追求代碼簡(jiǎn)潔。

        編寫代碼時(shí)務(wù)必牢記這點(diǎn)!

        via: https://golangbot.com/if-statement/
        作者:Naveen R

        參考資料

        [1]

        執(zhí)行: https://play.golang.org/p/RRxkgK07ul4

        [2]

        執(zhí)行: https://play.golang.org/p/bMevwhJhguO

        [3]

        執(zhí)行: https://play.golang.org/p/VNPbCiK9eXT

        [4]

        執(zhí)行: https://play.golang.org/p/_X9q4MWr4s

        [5]

        執(zhí)行: https://play.golang.org/p/RYNqZZO2F9

        [6]

        這里: https://golang.org/ref/spec#Semicolons

        [7]

        執(zhí)行: https://play.golang.org/p/hv_27vbIBC

        [8]

        執(zhí)行: https://play.golang.org/p/N8A5tPLnVYr

        -------------------?End?-------------------

        往期精彩文章推薦:

        歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

        想加入Go學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

        萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

        瀏覽 31
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 波多野吉衣毛片 | 中文在线最新版天堂8 | 老太婆80交性欧美 | 日本电影一区二区三区高清 | 亚洲视频免费 |