Go
语言提供了以下几种条件判断语句:
1. if 语句
Go
语言中if
语句的语法如下:
if 布尔表达式 {/* 在布尔表达式为 true 时执行 */}
示例:
package mainimport "fmt"func main() {/* 定义局部变量 */var a int = 10/* 使用 if 语句判断布尔表达式 */if a < 20 {/* 如果条件为 true 则执行以下语句 */fmt.Printf("a 小于 20\n" )}fmt.Printf("a 的值为 : %d\n", a)}
if
语句特点:
if
后面的条件判断子句不需要用小括号括起来;
{
必须放在行尾,和if
或者else if
放在一行;
if
后面可以带一个简单的初始化语句,并以分号分割,该简单语句声明的变量的作用域是整个if
语句块,包括后面的else if
和else
分支;
if
分支语句遇到return
后直接返回,遇到break
则跳过break
下方的if
语句块;
if
还有一种特殊的写法,可以在if
表达式之前添加一个执行语句,再根据变量值进行判断,代码如下:
if x :=f(); x<y{ // 初始化语句中的声明变量xreturn x} else if x > z {// x 在else if 里面一样可以被访问return z} else {return y}
f()
是一个带有返回值的函数,x := f()
是一个语句,执行 f() 后,将返回值保持在变量x
中。x<y
才是 if 的判断表达式,这种写法可以将返回值与判断放在一行进行处理,而且返回值的作用范围被限制在 if、else 语句组合中。
2. if…else… 语句
Go
语言中if...else...
语句的语法如下:
if 布尔表达式 {/* 在布尔表达式为 true 时执行 */} else {/* 在布尔表达式为 false 时执行 */}
示例:
package mainimport "fmt"func main() {/* 局部变量定义 */var a int = 100;/* 判断布尔表达式 */if a < 20 {/* 如果条件为 true 则执行以下语句 */fmt.Printf("a 小于 20\n" );} else {/* 如果条件为 false 则执行以下语句 */fmt.Printf("a 不小于 20\n" );}fmt.Printf("a 的值为 : %d\n", a);}
3. if 语句嵌套
Go
语言中if
嵌套语句的语法如下:
if 布尔表达式 1 {/* 在布尔表达式 1 为 true 时执行 */if 布尔表达式 2 {/* 在布尔表达式 2 为 true 时执行 */}}
示例:
package mainimport "fmt"func main() {/* 定义局部变量 */var a int = 100var b int = 200/* 判断条件 */if a == 100 {/* if 条件语句为 true 执行 */if b == 200 {/* if 条件语句为 true 执行 */fmt.Printf("a 的值为 100 , b 的值为 200\n" );}}fmt.Printf("a 值为 : %d\n", a );fmt.Printf("b 值为 : %d\n", b );}
4. switch 语句
switch
和if
语句一样,switch
后面可以带一个可选的简单的初始化语句;
switch
后面的表达式也是可选的,如果没有表达式, 则case
子句是一个布尔表达式,而不是一个值,此时就相当于多重if else
语句;
switch
条件表达式的值不像C/C++
语言那样必须限制为整数常量, 表达式不需要为常量,甚至不需要为整数,可以是任意支持相等比较运算的类型变量;
switch
语句用于基于不同条件执行不同动作,每一个case
分支都是唯一的,从上至下逐一测试,直到匹配为止;
switch
语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break
;
switch
默认情况下case
最后自带break
语句,匹配成功后就不会执行其他case
,如果我们需要执行后面的case
,可以使用fallthrough
;
switch
支持default
语句, 当所有的case
分支都不符合时, 执行default
语句, 并且default
语句可以放到任意位置,并不影响switch
的判断逻辑;
Go
语言中switch
语句的语法如下:
switch i:= "y", i {// switch 后面可以带上一个初始化语句case "y", "Y":// 多个 case 值使用逗号隔开Println("Yes")case "n", "N":Println("No")}switch var1 {case value1:...case value2:...default:...}
变量var1
可以是任何类型,而value1
和value2
则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型,或者最终结果为相同类型的表达式。
可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3
示例:
package mainimport "fmt"func main() {/* 定义局部变量 */var grade string = "B"var marks int = 90switch marks {case 90:grade = "A"case 80:grade = "B"case 50, 60, 70:grade = "C"default:grade = "D"}switch {// case 后不仅仅只是常量,还可以和 if 一样添加表达式// 注意,这种情况的 switch 后面不再需要跟判断变量。case grade == "A":fmt.Printf("优秀!\n")case grade == "B", grade == "C":fmt.Printf("良好\n")case grade == "D":fmt.Printf("及格\n")case grade == "F":fmt.Printf("不及格\n")default:fmt.Printf("差\n")}fmt.Printf("你的等级是 %s\n", grade)}
输出结果:
优秀!你的等级是 A
5. fallthrough
在Go
语言中case
是一个独立的代码块,执行完毕后不会像C
语言那样紧接着执行下一个case
,但是为了兼容一些移植代码,依然加入了fallthrough
关键字来实现这一功能。
使用fallthrough
会强制执行后面的case
语句,fallthrough
不会判断下一条case
的表达式结果是否为 true。代码如下:
package mainimport "fmt"func main() {switch {case false:fmt.Println("1、case 条件语句为 false")fallthroughcase true:fmt.Println("2、case 条件语句为 true")fallthroughcase false:fmt.Println("3、case 条件语句为 false")fallthroughcase true:fmt.Println("4、case 条件语句为 true")case false:fmt.Println("5、case 条件语句为 false")fallthroughdefault:fmt.Println("6、默认 case")}}
输出结果:
2、case 条件语句为 true3、case 条件语句为 false4、case 条件语句为 true