GO語言————5.1 控制結構之if-else結構
5.1 if-else 結構
if 是用於測試某個條件(布林型或邏輯型)的語句,如果該條件成立,則會執行 if 後由大括號括起來的程式碼塊,否則就忽略該程式碼塊繼續執行後續的程式碼。
if condition {
// do something
}
如果存在第二個分支,則可以在上面程式碼的基礎上新增 else 關鍵字以及另一程式碼塊,這個程式碼塊中的程式碼只有在條件不滿足時才會執行。if 和 else 後的兩個程式碼塊是相互獨立的分支,只可能執行其中一個。
if condition {
// do something
} else {
// do something
}
如果存在第三個分支,則可以使用下面這種三個獨立分支的形式:
if condition1 {
// do something
} else if condition2 {
// do something else
} else {
// catch-all or default
}
else-if 分支的數量是沒有限制的,但是為了程式碼的可讀性,還是不要在 if 後面加入太多的 else-if 結構。如果你必須使用這種形式,則把儘可能先滿足的條件放在前面。
即使當程式碼塊之間只有一條語句時,大括號也不可被省略(儘管有些人並不贊成,但這還是符合了軟體工程原則的主流做法)。
關鍵字 if 和 else 之後的左大括號 {
必須和關鍵字在同一行,如果你使用了 else-if 結構,則前段程式碼塊的右大括號 }
必須和 else-if 關鍵字在同一行。這兩條規則都是被編譯器強制規定的。
非法的 Go 程式碼:
if x{
}
else { // 無效的
}
要注意的是,在你使用 gofmt
格式化程式碼之後,每個分支內的程式碼都會縮排 4 個或 8 個空格,或者是 1 個 tab,並且右大括號與對應的 if 關鍵字垂直對齊。
在有些情況下,條件語句兩側的括號是可以被省略的;當條件比較複雜時,則可以使用括號讓程式碼更易讀。條件允許是符合條件,需使用 &&、|| 或 !,你可以使用括號來提升某個表示式的運算優先順序,並提高程式碼的可讀性。
一種可能用到條件語句的場景是測試變數的值,在不同的情況執行不同的語句,不過將在第 5.3 節講到的 switch 結構會更適合這種情況。
示例 5.1 booleans.go
package main
import "fmt"
func main() {
bool1 := true
if bool1 {
fmt.Printf("The value is true\n")
} else {
fmt.Printf("The value is false\n")
}
}
輸出:
The value is true
注意事項 這裡不需要使用 if bool1 == true
來判斷,因為 bool1
本身已經是一個布林型別的值。
這種做法一般都用在測試 true
或者有利條件時,但你也可以使用取反 !
來判斷值的相反結果,如:if !bool1
或者 if !(condition)
。後者的括號大多數情況下是必須的,如這種情況:if !(var1 == var2)
。
當 if 結構內有 break、continue、goto 或者 return 語句時,Go 程式碼的常見寫法是省略 else 部分(另見第 5.2 節)。無論滿足哪個條件都會返回 x 或者 y 時,一般使用以下寫法:
if condition {
return x
}
return y
注意事項 不要同時在 if-else 結構的兩個分支裡都使用 return 語句,這將導致編譯報錯 function ends without a return statement
(你可以認為這是一個編譯器的 Bug 或者特性)。( 譯者注:該問題已經在 Go 1.1 中被修復或者說改進 )
這裡舉一些有用的例子:
判斷一個字串是否為空:
if str == "" { ... }
if len(str) == 0 {...}
判斷執行 Go 程式的作業系統型別,這可以通過常量
runtime.GOOS
來判斷(第 2.2 節)。if runtime.GOOS == "windows" { . .. } else { // Unix-like . .. }
這段程式碼一般被放在 init() 函式中執行。這兒還有一段示例來演示如何根據作業系統來決定輸入結束的提示:
var prompt = "Enter a digit, e.g. 3 "+ "or %s to quit." func init() { if runtime.GOOS == "windows" { prompt = fmt.Sprintf(prompt, "Ctrl+Z, Enter") } else { //Unix-like prompt = fmt.Sprintf(prompt, "Ctrl+D") } }
函式
Abs()
用於返回一個整型數字的絕對值:func Abs(x int) int { if x < 0 { return -x } return x }
isGreater
用於比較兩個整型數字的大小:func isGreater(x, y int) bool { if x > y { return true } return false }
在第四種情況中,if 可以包含一個初始化語句(如:給一個變數賦值)。這種寫法具有固定的格式(在初始化語句後方必須加上分號):
if initialization; condition {
// do something
}
例如:
val := 10
if val > max {
// do something
}
你也可以這樣寫:
if val := 10; val > max {
// do something
}
但要注意的是,使用簡短方式 :=
宣告的變數的作用域只存在於 if 結構中(在 if 結構的大括號之間,如果使用 if-else 結構則在 else 程式碼塊中變數也會存在)。如果變數在 if 結構之前就已經存在,那麼在 if 結構中,該變數原來的值會被隱藏。最簡單的解決方案就是不要在初始化語句中宣告變數(見 5.2 節的例 3 瞭解更多)。
示例 5.2 ifelse.go
package main
import "fmt"
func main() {
var first int = 10
var cond int
if first <= 0 {
fmt.Printf("first is less than or equal to 0\n")
} else if first > 0 && first < 5 {
fmt.Printf("first is between 0 and 5\n")
} else {
fmt.Printf("first is 5 or greater\n")
}
if cond = 5; cond > 10 {
fmt.Printf("cond is greater than 10\n")
} else {
fmt.Printf("cond is not greater than 10\n")
}
}
輸出:
first is 5 or greater cond is not greater than 10
下面的程式碼片段展示瞭如何通過在初始化語句中獲取函式 process()
的返回值,並在條件語句中作為判定條件來決定是否執行 if 結構中的程式碼:
if value := process(data); value > max {
...
}
相關文章
- Go語言流程控制之迴圈結構篇Go
- Go 語言 結構體Go結構體
- GO語言————5.4 for 結構Go
- Go 語言 結構體連結串列Go結構體
- Go語言(1)——程式結構Go
- GO語言————5.3 switch 結構Go
- Go語言流程控制結構和函式解析Go函式
- Go 語言 結構體和方法Go結構體
- go語言學習-結構體Go結構體
- Go語言————7.3 For-range 結構Go
- 程式語言基本組成:控制結構
- Go 語言目錄結構與實踐Go
- GO語言————4.2 Go程式的基本結構和要素Go
- Perl語言學習(四)Perl控制結構
- GO語言基礎(結構+語法+型別+變數)Go型別變數
- C語言(結構體)C語言結構體
- 帶讀 |《Go in Action》(中文:Go語言實戰)語法和語言結構概覽 (二)Go
- 帶讀 |《Go in Action》(中文:Go語言實戰) 語法和語言結構概覽(三)Go
- Go語言入門系列(五)之指標和結構體的使用Go指標結構體
- Go語言實現的23種設計模式之結構型模式Go設計模式
- ### 流程控制語句結構
- 流程控制語句結構
- SQL語言(結構化查詢語言)SQL
- Go快速入門 03 | 控制結構:if、for、switch 邏輯語句Go
- C語言-選擇結構C語言
- Go語言學習筆記 - PART7 - 結構體Go筆記結構體
- Go語言內幕(1):主要概念與專案結構Go
- Go 筆記之程式結構Go筆記
- if-else擴充套件結構練習套件
- 控制結構
- Go基礎系列:流程控制結構Go
- go語言之結構體和方法Go結構體
- python中if語句的用法及if-else結構的使用Python
- 包羅永珍的結構體 -- 就要學習 Go 語言結構體Go
- C語言結構體專題C語言結構體
- C語言結構體大小分析C語言結構體
- Go 結構體Go結構體
- go程式結構Go