Go 语言循环语句
如果想要重复执行某些语句,Go 语言中您只有 for 结构可以使用。不要小看它,这个 for 结构比其它语言中的更为灵活。本章节我们要了解的就是循环语句的各种结构,以及如何跳出循环:
注意:其它许多语言中也没有发现和 do while 完全对等的 for 结构,可能是因为这种需求并不是那么强烈。
标签与 goto
for、switch 或 select 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:)结尾的单词。(标签的名称是大小写敏感的,为了提升可读性,一般建议使用全部大写字母)
示例:
package mainimport "fmt"func main() {LABEL1:for i := 0; i <= 5; i++ {for j := 0; j <= 5; j++ {if j == 4 {continue LABEL1}fmt.Printf("i is: %d, and j is: %d\n", i, j)}}}
上面的示例中,continue 语句指向 LABEL1,当执行到该语句的时候,就会跳转到 LABEL1 标签的位置。
您可以看到当 j==4 和 j==5 的时候,没有任何输出:标签的作用对象为外部循环,因此 i 会直接变成下一个循环的值,而此时 j 的值就被重设为 0,即它的初始值。如果将 continue 改为 break,则不会只退出内层循环,而是直接退出外层循环了。另外,还可以使用 goto 语句和标签配合使用来模拟循环。
示例:
package mainfunc main() {i:=0HERE:print(i)i++if i==5 {return}goto HERE}
上面的代码会输出 01234。
使用逆向的 goto(标签位于 goto 语句之前) 会代码逻辑混乱,可读性变差,所以应该选择更好的替代方案。
注意:在示例开中中,是不建议使用标签和 goto 语句的,它们很容易导致程序设计出现混乱,代码可读性变差,应该用更好的可读性更高的方案去代替。
定义但未使用标签会导致编译错误:label … defined and not used。
如果您必须使用 goto,应该只使用正序的标签(标签位于 goto 语句之后),但注意标签和 goto 语句之间不能出现定义新变量的语句,否则会导致编译失败。
示例:
// compile error goto2.go:8: goto TARGET jumps over declaration of b at goto2.go:8package mainimport "fmt"func main() {a := 1goto TARGET // compile errorb := 9TARGET:b += afmt.Printf("a is %v *** b is %v", a, b)}
练习:请描述下面 for 循环的输出:
i := 0for {// since there are no checks, this is an infinite loopif i >= 3 { break }// break out of this for loop when this condition is metfmt.Println("Value of i is:", i)i++}fmt.Println("A statement just after for loop.")for i := 0; i<7 ; i++ {if i%2 == 0 { continue }fmt.Println("Odd:", i)}