本文共 1315 字,大约阅读时间需要 4 分钟。
延迟语句defer
defer语句有两个特点
第一,只有当defer语句全部执行完成之后,defer函数才算真正的执行结束
第二,当函数中有defer语句时,需要等待所有的defer语句执行完毕,才会执行return语句
因为defer的特点,可以用于资源回收,清理收尾工作。使用defer后不用纠结代码放到哪里,反正都是最后执行。
func main() { defer fmt.Println("world!") fmt.Println("hello ")}结果:hello world!
var i = 0func main() { for ; i < 5; i++ { defer print() println("x", i) }}func print() { fmt.Println(i)}结果:x 0x 1x 2x 3x 455555
标签
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: 0i is: 0, and j is: 1i is: 0, and j is: 2i is: 0, and j is: 3i is: 1, and j is: 0i is: 1, and j is: 1i is: 1, and j is: 2i is: 1, and j is: 3i is: 2, and j is: 0i is: 2, and j is: 1i is: 2, and j is: 2i is: 2, and j is: 3i is: 3, and j is: 0i is: 3, and j is: 1i is: 3, and j is: 2i is: 3, and j is: 3i is: 4, and j is: 0i is: 4, and j is: 1i is: 4, and j is: 2i is: 4, and j is: 3i is: 5, and j is: 0i is: 5, and j is: 1i is: 5, and j is: 2i is: 5, and j is: 3
当 j==4 和 j==5 的时候,没有任何输出:标签的作用对象为外部循环,因此 i 会直接变成下一个循环的值,而此时 j 的值就被重设为 0,即它的初始值。如果将 continue 改为 break,则不会只退出内层循环,而是直接退出外层循环了
转载地址:http://zvqen.baihongyu.com/