A Tour Of Go - 条件循环

循环

只有 for 语句, 无需括号, 大括号必须

初始化变量仅在 {} 中有效

1
2
3
4
5
6
7
8
9
10
11
// 初始化, 循环执行前进行是否执行判断; 本次循环结束后执行语句
for init; cond; loop {}

// 初始化, 结束后执行语句均可省
for ; cond; {}

// 简写, 类似 while..do..
for cond {}

// 无限执行
for {}

条件

if 语句, 无需括号, 大括号必须

初始化变量在 if, else

1
2
3
4
if cond {} else {}

// 支持初始化
if init; cond {}

练习: 计算开根号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func Sqrt(x float64) float64 {
var z, lastValue float64 = 1.0, 1.0

for i := 0; i < 10; i++ {
z -= (z*z - x) / (2 * z)
fmt.Printf("%g %T %v\n", i, z, z)

if z == lastValue {
return z
} else if z < lastValue && lastValue-z < 0.1 {
return z
}
lastValue = z
}
return z
}

条件

switch 语句, 无需 break, 从上至下惰性执行(后面的条件不再判断)

case 值可以是静态的, 也可以是表达式或者函数返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch init; var {
case v1:
case v2 + v3:
case func1():
default:
}

// 没有条件的 switch, 可以将条件写到 case 中:
switch {
case x < 100:
case x == 100:
case x < 200:
...
}

Defer 函数退出时执行

defer 在 return 的时候执行, 但是 defer 语句的参数为声明时立即获取, 而非等 return 执行时再获取变量

多个 defer 使用堆栈管理, return 时后进先出

一般用于资源的释放

1
2
3
4
5
6
7
8
9
10
func main() {
var val int64 = 1
defer fmt.Print("world", val)

val += 1

fmt.Print("hello", val)
}

// => hello 2 world 1
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.