Go 流程控制语句
约 357 个字 126 行代码 预计阅读时间 3 分钟
唯一的循环:for
a
:初始化语句(可选)
b
:条件表达式
c
:后置语句(可选)
- 大括号必需
仅有条件表达式时可以省去分号,类似于其他语言的 while
。
| for b {
...
}
// 等价于
for ; b; {
...
}
|
死循环:
遍历
| for i, v := range Slice {
...
}
|
range
形式可遍历切片/映射。
迭代切片时,每次迭代都会返回两个值:
可将下标或值赋予 _
来忽略它:
| for i, _ := range Slice
for _, v := range Slice
|
若只需要索引,忽略第二个变量:
| for i := range Slice
// 等价于
for i, _ := range Slice
|
if
基本形式
大括号必需。
else
| if b {
....
} else {
....
}
|
else if
| if b1 {
...
} else if b2 {
...
}
} else {
...
}
|
可在条件表达式前实现一个简单的语句
| if a; b {
...
} else {
...
}
|
仅作用于 if
和对应的 else
内。
练习:牛顿法
| package main
import (
"fmt"
"math"
)
func abs(x float64) float64 {
if x < 0 {
return -x
} else {
return x
}
}
func Sqrt(x float64) float64 {
z := x/2
for i := float64(-x); abs(i - z) > 0.00000000001; {
i = z
z -= (z * z - x) / (2 * z)
fmt.Println(">> ", z)
}
return z
}
func main() {
t := 252465.0
fmt.Println(Sqrt(t))
fmt.Println(math.Sqrt(t))
}
|
来源:https://tour.go-zh.org/flowcontrol/8
switch
| switch b {
case b1:
...
case b2:
...
default:
...
}
|
基本形式
只运行选定的 case
,后面默认 break
,除非以 fallthrough
语句结束。
| switch a; b {
case b1:
...
case b2:
...
default:
...
}
|
可在条件表达式前实现简单语句。
| package main
import (
"fmt"
)
var tv int = 0
func test(x int) int{
tv = x
return x
}
func main() {
i := 2
k := 0
switch i {
case 0:
k = 1
case test(1):
k = 2
case 2:
k = 3
case test(3):
k = 12
default:
k = 4
}
fmt.Println(tv, i, k)
}
|
case
语句从上到下顺次执行,直到匹配成功时停止。
当 case
的值为函数时,在匹配值之前的 case
中的函数会被调用!
| switch {
case b1:
...
case b2:
...
default:
...
}
//等价于
if b1 {
...
} else if b2 {
...
} else {
...
}
|
switch
可以无条件,类似于if-else。
defer
在函数前使用,让函数推迟到外层函数返回之后执行。
推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。
推迟的函数调用存放在栈中,返回后以后进先出的顺序调用。