9、循环

55 阅读2分钟

本文为译文。原文地址:loops

由于本文整体概念比较简单,所以译者主要翻译一些go里独有的一些语法点。其余的和其他语言没啥两样。如有需要可以直接看原文。

go里只有一种循环,那就是for循环。语法

for initialisation; condition; post {  
}

initialisation初始化只会被执行一次。初始化完成后则会进行condition条件判断。如果条件是true则执行循环体。然后更新post

initialisation``condition``post这三部分都是可选的。

initialisation声明的变量只能在for循环内用。

labels

labels可以被用来从内部循环跳出到外部。我们搞个例子来理解一下

package main

import (  
    "fmt"
)

func main() {  
    for i := 0; i < 3; i++ {
        for j := 1; j < 4; j++ {
            fmt.Printf("i = %d , j = %d\n", i, j)
        }

    }
}

i = 0 , j = 1  
i = 0 , j = 2  
i = 0 , j = 3  
i = 1 , j = 1  
i = 1 , j = 2  
i = 1 , j = 3  
i = 2 , j = 1  
i = 2 , j = 2  
i = 2 , j = 3  

当我们i==j时我们想跳出循环怎么办。如果我们在内部循环中使用break那么只能跳出内部循环。代码如下

package main

import (  
    "fmt"
)

func main() {  
    for i := 0; i < 3; i++ {
        for j := 1; j < 4; j++ {
            fmt.Printf("i = %d , j = %d\n", i, j)
            if i == j {
                break
            }
        }

    }
}

i = 0 , j = 1  
i = 0 , j = 2  
i = 0 , j = 3  
i = 1 , j = 1  
i = 2 , j = 1  
i = 2 , j = 2 

那要怎么做呢?这个时候label就起到作用了。代码如下

package main

import (  
    "fmt"
)

func main() {  
outer:  
    for i := 0; i < 3; i++ {
        for j := 1; j < 4; j++ {
            fmt.Printf("i = %d , j = %d\n", i, j)
            if i == j {
                break outer
            }
        }

    }
}

i = 0 , j = 1  
i = 0 , j = 2  
i = 0 , j = 3  
i = 1 , j = 1  

更多例子

package main

import (  
    "fmt"
)

func main() {  
    i := 0
    for ;i <= 10; { // initialisation and post are omitted
        fmt.Printf("%d ", i)
        i += 2
    }
}

package main

import (  
    "fmt"
)

func main() {  
    i := 0
    for i <= 10 { //semicolons are ommitted and only condition is present
        fmt.Printf("%d ", i)
        i += 2
    }
}

package main

import (  
    "fmt"
)
//It is possible to declare and operate on multiple variables in for loop.
func main() {  
    for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 { //multiple initialisation and increment
        fmt.Printf("%d * %d = %d\n", no, i, no*i)
    }

}

infinite loop

for {  
}