Go 語(yǔ)言基礎(chǔ) - if-else
回復(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
參考資料
執(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è)【在看】行不行
