if 语句
特点
if
后面的条件判断不需要用小括号括起来{
必须放在行尾,和if
或else if / else
放在一行if
后面可以带一个简单的初始化语句,并以分好进行分割,该简单语句声明的变量的作用域是整个if
语句块,包括后面的else if
和else
分支。- Go语言没有三元运算符
?:
。 -
示例
if x := f(); x < y { // 在初始化语句中声明变量x, x的值为函数f()的执行结果
return x
} else if x > z { // x可以在条件中访问,也可以在代码块中访问
return z
} else {
return y
}
switch 语句
特点
switch
和if
语句一样,switch
后面可以带一个可选的简单的初始化语句。switch
后面的表达式是可选的,如果没有表达式,则case
子句是一个布尔表达式,而不是一个值。switch
条件表达式的值可以是任意支持相等比较运算的类型变量。- 多个
case
值使用逗号分隔。 - 多个
case
表达式之间不需要使用break
来跳出。 - 通过
fallthrough
语句来强制执行下一个case
子句(不再判断下一个case
语句的条件是否满足) switch
支持default
语句,并且default
语句可以放在任意位置。示例
```go f := func() string { return “Y” } switch x := f(); x { // switch后面带上一个初始化语句,此时x为f() 运行结果 case “Y”, “y”: // 多个case值可以使用,进行分隔 fmt.Println(“yes”) default: // 当条件都不满足时的默认情况,default的顺序不影响代码执行 fmt.Println(“Unknown”) case “n”, “N”: fmt.Println(“No”) }
// 使用fallthrough强制执行下面的case switch x := f(); x { // switch后面带上一个初始化语句,此时x为f() 运行结果 case “Y”, “y”: // 多个case值可以使用,进行分隔 fmt.Println(“yes”) fallthrough // fallthrough只影响下一个的case或default case “n”, “N”: fmt.Println(“No”) // 上层有fallthrough此时No分支也会执行 case “m”, “M”: fmt.Println(“Me”) // 上层没有fallthrough 此时Me分支不会执行 }
// 没有表达式的switch
score := 85
switch {
case score >= 90: // 没有条件表达式时,case语句需要是一个布尔值表达式
fmt.Println(“A”)
case score >= 80:
fmt.Println(“B”) // 不需要使用break跳出switch后面也不会执行
case score >= 70:
fmt.Println(“C”)
case score >= 60:
fmt.Println(“D”)
default:
fmt.Println(“F”)
}
//输出: B
<a name="LIo2g"></a>
### for 语句
<a name="NHC3Y"></a>
#### 特点
- 可以使用普通的for循环
- 可以使用条件循环,相当于 `while(condition)`
- 可以使用无限循环,相当于 `while(true)`
- 可以使用循环遍历数组,切片,字符串,map和通道。
<a name="0c0dg"></a>
#### 示例
```go
// 1. 普通for循环
for i := 0; i < 100; i++ {
fmt.Println(i) //0 1 2 3 ... 99
}
// 2. 条件循环
i := 1
for i < 100 {
fmt.Println(i) // 1 5 25
i *= 5
}
// 3. 无限循环
for { }
// 4. 遍历数组,切片,字符串,map和通道
arr := [2]int{1, 2}
m := map[string]int{"a": 1, "b": 10}
str := "hello, 世界"
s := make([]int, 10)
// 遍历数组/切片
for index, value := range arr{ }
for index := range arr { }
for _, value := range arr{ }
// 遍历map
for key, value := range m {}
for key := range m{}
for _, value := range m {}
// 遍历字符串
for i :=0;i<len(str);i++ { // 遍历字节数组
fmt.Println(str[i])
}
for i, v := range str { // 遍历rune数组
fmt.Println(i, v)
}
// 访问通道
for value := range channel{} // 访问通道时,只有一个参数
标签和跳转
标签
Go语言使用标签 Label
来标识一个语句的位置,用于 goto
, break
, continue
语句的跳转。
Label:
Statement
goto
goto
语句用于函数的内部跳转,需要配合标签使用,使用 goto Label
会跳转到标签名后的语句处执行。
- goto语句只能在函数内跳转
- goto语句不能跳过内部变量声明语句,这些变量在goto语句的标签语句处又是可见的
- goto语句只能跳到同级作用域或者上层作用域内,不能跳转到内部作用域内
- goto之后,goto后面的代码不会执行
- 闭包内的goto不能调动上层作用域的Label ```go // goto 语句不能跳过变量声明 func main() { goto L v := 3 // ❌goto L jumps over declaration of v L: fmt.Println(“L”) }
// goto不能在闭包中使用 func main() { fmt.Println(1) func() { fmt.Println(“Nested function”) goto End // ❌label End not definedgo }() End: fmt.Println(2) }
// goto 语句作用域 func main() { if n % 2 == 1 { goto L1 // ❌goto L1 jumps into block starting } for n > 0 { n— L1: n— } } ```