1. for 循环格式

Gofor
  • 和 C 语言的 for 一样
for init; condition; post { }
initfor
conditiontrue
postfor(){for
GoforCGo

示例-1:

var i int

for ; ; i++ {

    if i > 10 {
        break
    }
}
Cwhile
for condition { }

示例-2

var i int
for i <= 10 {
    i++
}
Cfor(;;)
for { }

示例-3

var i int

for {
    if i > 10 {
        break
    }
    i++
}

2. for 循环示例

package main

import "fmt"

func main() {

   var b int = 15
   var a int

   numbers := [6]int{1, 2, 3, 5} 

   /* for 循环 */
   for a := 0; a < 10; a++ {	// 左花括号{必须与 for 处于同一行
      fmt.Printf("a 的值为: %d\n", a)
   }

   for a < b {
      a++
      fmt.Printf("a 的值为: %d\n", a)
   }

   for i, x:= range numbers {
      fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
   }   
}

3. 嵌套 for 循环

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var i, j int

   for i=2; i < 100; i++ {
      for j=2; j <= (i/j); j++ {
         if(i%j==0) {
            break; // 如果发现因子,则不是素数
         }
      }
      if(j > (i/j)) {
         fmt.Printf("%d  是素数\n", i);
      }
   }  
}

4. for 循环应用

Gorangeforarrayslicechannelmapfor range
mapchannel

4.1 访问数组

for index , value :=range arry{}
for index := range arry{}
for _, value :=range arry{}
_
for rangekeyvalue
package main

import "fmt"

func main() {
	array := [3]int{10, 20, 30}
	for i, v := range array {
		fmt.Printf("index is %v, value is %v\n", i, v)
	}

	for _, v := range array {
		fmt.Printf("value is %v\n", v)
	}
	for i := range array {
		fmt.Printf("index is %v\n", i)
	}
}

输出:

index is 0, value is 10
index is 1, value is 20
index is 2, value is 30
value is 10
value is 20
value is 30
index is 0
index is 1
index is 2

4.2 访问切片

for index, value :=range slice{}
for index := range slice{}
for _, value :=range slice{}

代码演示和数组类似,只需要做如下改动:

array := [3]int{10, 20, 30} // 数组
array := []int{10, 20, 30}	// 切片

4.3 访问字典

mapkeyvaluemapkeymap
for key , value := range map{}
for key := range map {}

4.4 访问字符串

rangeUnicode
for index, value := range string
for index := range string

示例:

package main

import "fmt"

func main() {
	s := "hello"
	for i := range s {
		fmt.Printf("value is %v\n", s[i])
	}
}

4.5 访问通道

for rangechannel
for value :=range channel{}

代码示例:

c := make(chan int)

go func() {

    c <- 1
    c <- 2
    c <- 3
    close(c)
}()

for v := range c {
    fmt.Println(v)
}

4. 循环控制语句

4.1 goto

goto
goto Lable
goto Lablegoto
gotogotogoto
    goto L // BAD ,跳过v := 3 这条语句是不允许的
    v := 3
L :
goto
if n%2 == 1 {
    goto LL
}
for n > 0 {
    f()
    n-- 
LL:
    f()
    n--
}

代码示例:

package main

import "fmt"

func main() {

	for x := 0; x < 10; x++ {
		for y := 0; y < 10; y++ {
			if y == 2 {
				// 跳转到标签
				goto breakHere
			}
		}
	}
	// 手动返回, 避免执行进入标签
	return
	// 标签
breakHere:
	fmt.Println("done")
}

4.2 continue

continue
continueforforcontinue

例如:

package main

import "fmt"

func main() {

OuterLoop:
	for i := 0; i < 2; i++ {

		for j := 0; j < 5; j++ {
			switch j {
			case 2:
				fmt.Println(i, j)
				continue OuterLoop
			}
		}
	}

}

4.3 break

breakforswitchselect
breakforswitchselectforswitchselectbreak

例如:

package main

import "fmt"

func main() {

Ll:
	for i := 0; ; i++ {
		for j := 0; ; j++ {
			if i >= 5 {
				// 跳到 Ll 标签所在的 for 循环 i++ 处执行
				fmt.Println(i)
				break Ll
				//the following is not executed
			}
			if j > 10 {
				fmt.Println(j)
				// 默认仅跳到离 break 最近的内层循环 j++ 处执行
				break
			}
		}
	}

}

labelbreakbreakforswitchselect
func main() {
    var sl = []int{5, 19, 6, 3, 8, 12}
    var firstEven int = -1

    // find first even number of the interger slice
loop:
    for i := 0; i < len(sl); i++ {
        switch sl[i] % 2 {
        case 0:
            firstEven = sl[i]
            break loop
        case 1:
            // do nothing
        }
    }
    println(firstEven) // 6
}
looplabelforforbreak looplabel loopfor