延迟语句defer
defer语句有两个特点
第一,只有当defer语句全部执行完成之后,defer函数才算真正的执行结束
第二,当函数中有defer语句时,需要等待所有的defer语句执行完毕,才会执行return语句
因为defer的特点,可以用于资源回收,清理收尾工作。使用defer后不用纠结代码放到哪里,反正都是最后执行。
func main() {
defer fmt.Println("world!")
fmt.Println("hello ")
}
结果:
hello
world!
var i = 0
func main() {
for ; i < 5; i++ {
defer print()
println("x", i)
}
}
func print() {
fmt.Println(i)
}
结果:
x 0
x 1
x 2
x 3
x 4
5
5
5
5
5
标签
for、switch 或 select 语句都可以打上标签
标签格式如下:
LA1:
fmt.Println("hello!")
for i := 0; i < 5; i++ {
if i == 3 {
goto LA1
}
fmt.Println(i)
}
LA1:
fmt.Println("hello!")
注意:
尽量不要用goto
goto结构很乱的
LA2:
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
continue LA2
}
fmt.Printf("i is: %d, and j is: %d\n", i, j)
}
}
结果:
i is: 0, and j is: 0
i is: 0, and j is: 1
i is: 0, and j is: 2
i is: 0, and j is: 3
i is: 1, and j is: 0
i is: 1, and j is: 1
i is: 1, and j is: 2
i is: 1, and j is: 3
i is: 2, and j is: 0
i is: 2, and j is: 1
i is: 2, and j is: 2
i is: 2, and j is: 3
i is: 3, and j is: 0
i is: 3, and j is: 1
i is: 3, and j is: 2
i is: 3, and j is: 3
i is: 4, and j is: 0
i is: 4, and j is: 1
i is: 4, and j is: 2
i is: 4, and j is: 3
i is: 5, and j is: 0
i is: 5, and j is: 1
i is: 5, and j is: 2
i is: 5, and j is: 3
当 j==4 和 j==5 的时候,没有任何输出:标签的作用对象为外部循环,因此 i 会直接变成下一个循环的值,而此时 j 的值就被重设为 0,即它的初始值。如果将 continue 改为 break,则不会只退出内层循环,而是直接退出外层循环了