概述

if 语句是 Go 语言中提供的一种分支控制结构,根据布尔表达式的值,在两个分支中选择一个执行

1
2
3
4
5
if boolean_expression {
// 新分支
}

// 原分支

二分支结构

1
2
3
4
5
if boolean_expression {
// 分支 1
} else {
// 分支 2
}

多分支结构

1
2
3
4
5
6
7
8
9
if boolean_expression1 {
// 分支 1
} else if boolean_expression2 {
// 分支 2
} else if boolean_expression3 {
// 分支 3
} else {
// 分支 4
}
1
2
3
4
5
6
7
8
9
10
11
12
13
if boolean_expression1 {
// 分支 1
} else {
if boolean_expression2 {
// 分支 2
} else {
if boolean_expression3 {
// 分支 3
} else {
// 分支 4
}
}
}

特点

  1. Go 函数一样,if 语句的分支代码的左大括号与 if 关键字在同一行 - Go 代码风格的统一要求
  2. if 语句的布尔表达式整体不需要用括号包括
  3. if 关键字后面的条件判断表达式的求值结果必须是布尔类型(true or false)
1
2
3
if runtime.GOOS == "darwin" {
println("Hello macOS!")
}

如果判断的条件比较多,可以用多个逻辑操作符连接多个条件判断表达式

1
2
3
if runtime.GOOS == "darwin" || runtime.GOOS == "linux" {
println("Hello, Unix!")
}

自用变量

自用变量为在 if 后的布尔表达式之前声明的变量,只能在 if 语句的代码块范围内使用

a、b、c 位于各级 if 的隐式代码块
作用域始于其声明所在的代码块,并一直扩展至嵌入到这个代码块的所有内层代码块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func f() int {
return 1
}

func h() int {
return 2
}

func main() {
if a, c := f(), h(); a > 0 {
println(a)
} else if b := f(); b > 0 {
println(a, b)
} else {
println(a, b, c)
}
}

容易导致变量遮蔽

1
2
3
4
5
x := 1
if x := 2; true {
println(x) // 2
}
println(x) // 1

最佳实践

快乐路径 - Happy Path

  1. 仅使用单分支控制结构
  2. 当出现错误时,在单分支中快速返回
  3. 正常逻辑的代码,布局上始终靠左
  4. 函数执行到最后一行代表成功