Go 語言基礎(chǔ) - if-else
回復(fù)“Go語言”即可獲贈從入門到進(jìn)階共10本電子書
你好,我是四哥。
上篇文章我們學(xué)習(xí)了包的用法,這篇文章來學(xué)習(xí) if-else 語句。
if 是一個具有布爾條件的語句,如果該條件的計算結(jié)果為 true,將會執(zhí)行 if 后面大括號里的代碼,如果結(jié)果為 false,則會執(zhí)行 else 后大括號里的代碼。
通過這篇文章,我們會學(xué)習(xí)了解 if 語句的各種語法和使用方法。
if 語法
if 語句的語法如下所示:
if?condition?{
}
如果判斷 condition 為 true,則執(zhí)行大括號 {} 之間的代碼。
與 C 等其他語言不同,大括號 {} 是強(qiáng)制性的,即使大括號之間只有一行代碼。
示例
讓我們編寫一個簡單的程序來判斷一個數(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,因為 num 次數(shù)偶數(shù),所以余數(shù)為 0,程序輸出 The number 10 is even。
if-else 語句
if 語句有對應(yīng)的 else 分支,如果 condition 結(jié)果為 false,則會執(zhí)行 else 分支。
if?condition?{
}?else?{
}
在上面的代碼,如果 condition 結(jié)果為 false,則 else 分支 {} 之間的代碼行將被執(zhí)行。
讓我們使用 if-else 語句重寫程序來判斷數(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]
上面的代碼中,我們沒有在條件為 true 時直接返回,而是創(chuàng)建了 else 語句,當(dāng)條件為 false 時,將執(zhí)行該語句。在我們這個 case 中,由于 11 是奇數(shù),因此 if 條件為 false,所以會執(zhí)行 else 語句中的代碼。
上面代碼執(zhí)行輸出:
the?number?11?is?odd
if-else if-else 語句
if 語句不僅有 else 分支,還可以有 else-if 分支,語法如下:
if?condition1?{
...
}?else?if?condition2?{
...
}?else?{
...
}
代碼執(zhí)行時會從上之下判斷每個分支的 condition 是否為 true。
上面的代碼,如果 condition1 為 true,將會執(zhí)行 condition1 后面 {} 之間的代碼;
如果 condition1 為 false 且 condition2 為 true,則會執(zhí)行 condition2 后面 {} 之間的代碼;
如果 condition1 和 condition2 都為 false,則會執(zhí)行 else 后面 {} 之間的代碼。
可以有任意數(shù)量的 else-if 語句塊。
通常,只要 if 和 else-if 語句有一個 condition 為 true,就會執(zhí)行相應(yīng)的代碼塊,如果沒有為 true 的情況則會執(zhí)行 else 分支的代碼。
我們使用 else-if 語句編寫一段程序:
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 包含初始化語句
if 語句的一種變體是在判斷條件之前,可以有短變量聲明語句,語法如下:
if?assignment-statement;?condition?{
}
上面的代碼片段,短變量聲明語句會優(yōu)先執(zhí)行。
我們用上面的語法重寫代碼來判斷數(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 語句中被初始化,
需要注意的是,num 的作用域僅限于 if-else 語句塊內(nèi),即如果我們在 if-else 之外訪問 num,編譯器將會報錯。
當(dāng)我們僅僅想聲明一個只在 if-else 內(nèi)部使用的變量時,這種語法就可以派上用場,可確保變量的作用范圍僅在 if-else 語句內(nèi)。
坑
else 語句應(yīng)該在 if 語句的右大括號 } 之后的同一行開始。如果不是,會編譯報錯。
寫一小段程序理解下:
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 語句沒有緊跟著 if 語句的 } 后面 ,相反,它是另起新的一行開始。如果你執(zhí)行程序編譯器將會報錯。
./prog.go:12:5:?syntax?error:?unexpected?else,?expecting?}
報錯的原因在于 Go 會自動插入分號,關(guān)于插入分號的規(guī)則可以點擊這里[6]查看更多信息。
其中有一項規(guī)則,如果一行代碼以 } 結(jié)束,則會在 } 后面自動加上分號,所以上面代碼第 11 行,會被編譯器在 } 后面自動加上分號。
我們的代碼就變成了:
...
if?num%2?==?0?{
??????fmt.Println("the?number?is?even")
};??//semicolon?inserted?by?Go?Compiler
else?{
??????fmt.Println("the?number?is?odd")
}
由于 if-else 是一個獨立的語句,中間不應(yīng)出現(xiàn)分號,因此,程序編譯會報錯。因此,將 else 緊跟在 if 語句的右大括號 } 之后是語法要求。
正確格式的代碼如下:
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 語句,針對同一功能可以用這些不同語句編寫出不同的實現(xiàn)方法。例如,我們使用 if-else 語句及其變體實現(xiàn)了不同的方式去判斷一個數(shù)字是奇數(shù)還是偶數(shù)。你可能會問,哪種方式才是 Go 語言常用的方式呢?
在 Go 的設(shè)計哲學(xué)中,最好避免不必要的分支和代碼縮進(jìn)。執(zhí)行時盡早返回也被認(rèn)為是更好的。
再來展示下之前的代碼:
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 語言的設(shè)計哲學(xué)該如何編寫上述的代碼呢?應(yīng)該盡量避免 else 分支;如果 if 語句的條件為 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 語言的哲學(xué) -- “大道至簡”,盡量追求代碼簡潔。
編寫代碼時務(wù)必牢記這點!
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?-------------------
往期精彩文章推薦:

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Go學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
