HOWTO · Go
Go 中與 C 三元運算子等價的慣用寫法
本教學使用 if-else 陳述式,探討 Go 中與 C 三元運算子等價的慣用寫法。透過清楚的範例與說明,學習如何在 Go 中實作條件邏輯。了解 Go 強調可讀性與可維護性的設計哲學所帶來的優點,讓您的程式碼更容易理解。
本頁內容
Go 沒有三元運算子。若要根據條件選擇一個值,請使用 if/else 陳述式,並在每個分支中指定結果。這樣可以讓決策以控制流程的形式保持可見,並且在任何允許陳述式的地方都能運作。
C 的三元運算子有什麼作用
C 的條件運算子使用 condition ? true_expression : false_expression 這種形式。它有三個運算元:一個條件,以及兩個提供結果的表達式。C 會先評估條件,然後在條件為真時評估 ? 後面的表達式,或在條件為假時評估 : 後面的表達式。例如,int b = (a > 3) ? 10 : 20; 在 a 大於 3 時將 10 指定給 b,否則指定 20。
這種形式是一個表達式,因此可以出現在更大的表達式內部,或出現在指定的右側。Go 刻意沒有等價的行內條件表達式。它的 if 陳述式是一個陳述式,因此 Go 的翻譯會將指定放在分支中,而不是試圖把 if 放在 C 預期表達式的位置。
在 Go 中使用 if-else
以下完整程式翻譯了 C 的指定,也示範了如何根據布林條件指定 1 或 0。短宣告 a := 5 會建立並初始化 a;var b int 會在任一分支指定之前宣告 b。else 分支必須緊接在 if 分支的右大括號之後。變更 a,看看每個決策指定了哪個值。
package main
import "fmt"
func main() {
a := 5
var b int
if a > 3 {
b = 10
} else {
b = 20
}
var isLarge int
if a > 3 {
isLarge = 1
} else {
isLarge = 0
}
fmt.Println(b)
fmt.Println(isLarge)
}
10
1
第一個決策在 10 和 20 之間選擇,與 C 的指定相符。第二個決策將條件轉換為整數旗標。這些都是每個分支中的普通指定。上面的輸出顯示了程式印出的值。
if 也可以包含初始化陳述式,例如 if n := len(items); n > 0 { ... }。在那裡宣告的變數僅限於該 if 陳述式及其 else 分支。當該值僅供該決策使用時,請使用這種形式;否則,請在陳述式之前宣告它,以便後續程式碼可以使用它。
在 Go 中處理多個條件
當一個決策有兩個以上的結果時,if/else if 鏈可以讓順序明確。Go 會由上到下檢查條件,並執行第一個相符的分支;最後的 else 處理所有其餘的值。請將最有用的區分以清楚的順序排列,尤其是當一個條件包含另一個條件相符的值時。
對於一個表達式的多個互斥值,switch 可能比長鏈更容易檢閱。傳統的 switch 會將一個值與其 case 值進行比較。Go 也允許無表達式的 switch,其中每個 case 包含一個布林條件,類似於 if/else if 鏈。例如,switch { case score >= 90: grade = "A"; case score >= 80: grade = "B"; default: grade = "C" } 表達了有序的範圍。在格式化的 Go 原始碼中,為了可讀性,請將每個 case 的主體放在各自的行上。
switch 和 if 鏈都不是三元表達式:兩者都是控制哪些陳述式執行的陳述式。對於小型決策或有序條件,請選擇 if/else;當將多個案例分組能讓選擇更容易理解時,請選擇 switch。switch 是一個選項,而不是普遍更好的替代方案;決策的形狀應該引導選擇。
FAQ
什麼是 C 中的三元運算子?
它是 C 的條件運算子,寫作 condition ? true_expression : false_expression。條件會選擇兩個結果表達式中的一個。
Go 有三元運算子嗎?
沒有。Go 使用 if/else 陳述式進行條件邏輯。您不能在指定或函數引數中將 if 陳述式用作行內表達式。
我可以在 Go 中使用巢狀 if-else 陳述式嗎?
可以。對於多個結果,else if 鏈通常比將每個 if 巢狀在另一個裡面更容易理解。兩種形式都是陳述式,每個分支都可以指定一個值或執行其他工作。
我應該在什麼時候改用 switch?
當案例形成一組清楚的替代方案時,或當無表達式的 switch 讓多個相關條件更容易閱讀時,請使用 switch。當有序比較能更直接地傳達決策時,請使用 if/else if 鏈。
實用的翻譯是讓條件及其替代方案保持明確:閱讀 C 程式碼時使用 C 的 ?:,而對應的 Go 控制流程則使用 Go 的 if/else 或 switch 陳述式。