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