go的if语句 (go语言为什么if后要加括号)

Go 语言是站在 C 语言等的肩膀之上诞生与成长起来的。Go 语言继承了 C 语言的很多语法,这里就包括控制结构。并且在其基础上增加了自己的优化和改进,比如:

Go 坚持“一件事情仅有一种做法的理念”,只保留了 for 这一种循环结构,去掉了 C 语言中的 while 和 do-while 循环结构;

Go 填平了 C 语言中 switch 分支结构中每个 case 语句都要以 break 收尾的“坑”;

Go 支持了 type switch 特性,让“类型”信息也可以作为分支选择的条件;

Go 的 switch 控制结构的 case 语句还支持表达式列表,让相同处理逻辑的多个分支可以合并为一个分支,等等。

if 语句是 Go 语言中提供的一种分支控制结构,它也是 Go 中最常用、最简单的分支控制结构。它会根据布尔表达式的值,在两个分支中选择一个执行。


if boolean_expression {
    // 新分支
}

// 原分支

分支结构是传统结构化程序设计中的基础构件,这个 if 语句中的代码执行流程就等价于下面这幅流程图:

go语言为什么if后要加括号,if语句单分支结构

代码执行遇到 if 分支结构后,首先会对其中的布尔表达式(boolean_expression)进行求值,如果求值结果为 true,那么程序将进入新分支执行,如果布尔表达式的求值结果为 false,代码就会继续沿着原分支的路线继续执行。

Go的if特点:

第一,和 Go 函数一样,if 语句的分支代码块的左大括号与 if 关键字在同一行上,这也是 Go 代码风格的统一要求,gofmt 工具会帮助我们实现这一点;

第二,if 语句的布尔表达式整体不需要用括号包裹,一定程度上减少了开发人员敲击键盘的次数。而且,if 关键字后面的条件判断表达式的求值结果必须是布尔类型,即要么是 true,要么是 false:

如果判断的条件比较多,我们可以用多个逻辑操作符连接起多个条件判断表达式,比如这段代码就是用了多个逻辑操作符 && 来连接多个布尔表达式:


if (runtime.GOOS == "linux") && (runtime.GOARCH == "amd64") &&
    (runtime.Compiler != "gccgo") {
    println("we are using standard go compiler on linux os for amd64")
}

除了逻辑操作符 && 之外,Go 还提供了另外两个逻辑操作符,如下:

go语言为什么if后要加括号,if语句单分支结构

Go 语言的操作符是有优先级的:

go语言为什么if后要加括号,if语句单分支结构

分支结构的布尔表达式需要遵循这个优先级,如果记不住可以在 if 布尔表达式中,使用带有小括号的子布尔表达式来清晰地表达判断条件。

if语句的二分支结构


if boolean_expression {
  // 分支1
} else {
  // 分支2
}

二分支控制结构比较好理解。当 boolean_expression 求值为 true 时,执行分支 1,否则,执行分支 2。

if语句的多分支结构


if boolean_expression1 {
  // 分支1
} else if boolean_expression2 {
  // 分支2

... ...

} else if boolean_expressionN {
  // 分支N
} else {
  // 分支N+1
}

支持声明 if 语句的自用变量

无论是单分支、二分支还是多分支结构,我们都可以在 if 后的布尔表达式前,进行一些变量的声明,在 if 布尔表达式前声明的变量,我叫它 if 语句的自用变量。顾名思义,这些变量只可以在 if 语句的代码块范围内使用,比如下面代码中的变量 a、b 和 c:


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)
    }
}

我们可以看到自用变量声明的位置是在每个 if 语句的后面,布尔表达式的前面,而且,由于声明本身是一个语句,所以我们需要把它和后面的布尔表达式通过分号分隔开。

在 if 语句中声明自用变量是 Go 语言的一个惯用法,这种使用方式直观上可以让开发者有一种代码行数减少的感觉,提高可读性。同时,由于这些变量是 if 语句自用变量,它的作用域仅限于 if 语句的各层隐式代码块中,if 语句外部无法访问和更改这些变量,这就让这些变量具有一定隔离性,这样你在阅读和理解 if 语句的代码时也可以更聚焦。