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 语句。