3.2. 构建循环-for

3.2.1. 1. for常用遍历方式

我们可以用for循环来迭代数组。下面常见的几种方式都可以用来遍历数组:

for i := range a {
    fmt.Printf("a[%d]: %d\n", i, a[i])
}
for i, v := range b {
    fmt.Printf("b[%d]: %d\n", i, v)
}
for i := 0; i < len(c); i++ {
    fmt.Printf("c[%d]: %d\n", i, c[i])
}

3.2.2. 2.for初始语句-开始循环时执行的语句

package main

import "fmt"

func main() {
    step := 2
    for ;step>0 ;step--  {
        fmt.Println(step)
    }
}

//2
//1

3.2.3. 3.两种for循环遍历命令行参数

for initialization;condition;post {
//零个或多个语句
}

示例

package main

import (
    "fmt"
    "os"
)

func main() {
    var s, sep string
    for i := 1; i < len(os.Args); i++ {
        s += sep + os.Args[i]
        sep = " "
    }
    fmt.Println(s)
}

使用range产生索引的循环方式

package main

import (
    "fmt"
    "os"
)

func main() {
    s, sep := "", ""
    for _, arg := range os.Args[1:] {
        s += sep + arg
        sep = " "
    }
    fmt.Println(s)
}

3.2.4. 4.for中的条件表达式-控制是否循环的开关

4.1 结束循环时带可执行语句的无限循环

package main

import "fmt"

func main() {
    var i int
    // 无限循环语句
    for ; ; i++ {
        if i > 10 {
            break
        }
        fmt.Print(i," ")
    }
}

4.2 无限循环

package main

import (
    "fmt"
    "time"
)

func main() {
    for {
        fmt.Printf("loop ......\n")
        time.Sleep(time.Millisecond * 1000)
    }
}

美观的无限循环写法

package main

import "fmt"

func main() {
    var i int
    for {
        if i > 10 {
            break
        }
        i++
        fmt.Println(i)
    }

}

在上面代码的基础上进一步简化代码,将if判断整合到for中,变为下面的代码: ### 4.3 只有一个条件的循环

var i int
for i <= 10 {
    i++
    fmt.Print(i," ")
}

4.4 for中的结束语句

在结束每次循环前执行的语句,如果循环被break、goto、return、panic等语句强制退出,结束语句不会被执行。

打印一个99乘法表

package main

import "fmt"

func main() {
    for i := 1; i <= 9; i++ {
        for x := 1; x <= i; x++ {
            fmt.Printf("%d*%d=%d ", i, x, x*i)
        }
        fmt.Println() // 添加一个换行符
    }

}

/*1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 */

3.2.5. 5. 键值循环(for range)-直接获得对象的索引和数据

5.1 遍历数组、切片 - 获得索引和元素

在遍历代码中,key和value分别代表切片的下标及下标对应的值。

package main

import "fmt"

func main() {
    for i, i2 := range []int{1, 2, 3, 4, 5, 6} {
        fmt.Printf("key:%d value:%d\n", i, i2)
    }
}

/*
key:0 value:1
key:1 value:2
key:2 value:3
key:3 value:4
key:4 value:5
key:5 value:6
*/

5.2 遍历字符串-获得字符

package main

import "fmt"

func main() {
    var str = "hello 你好"
    for i, i2 := range str {
        fmt.Printf("key:%d value:0x%x\n", i, i2)
    }
}
/*
key:0 value:0x68
key:1 value:0x65
key:2 value:0x6c
key:3 value:0x6c
key:4 value:0x6f
key:5 value:0x20
key:6 value:0x4f60
key:9 value:0x597d
*/

5.3 遍历map-获得map的键和值

package main

import "fmt"

func main() {
    m := map[string]int{
        "num1":12,
        "num2":13,
        "num3":14,
    }
    for i, i2 := range m {
        fmt.Printf("key:%s value:%d\n",i,i2)
    }
}
/*
key:num3 value:14
key:num1 value:12
key:num2 value:13
*/

5.4 遍历通道(channel)-接收通道数据

package main

import "fmt"

func main() {
    c := make(chan int)     // 创建了一个整型类型的通道
    /*
    往通道里面推送 1 2 3,然后关闭通道
     */
    go func() {
        c <- 1
        c <- 2
        c <- 3
        close(c)
    }()
    // 不断地从通道中取数据,直到通道被关闭
    for v := range c {
        fmt.Println(v)
    }
}

5.5 在遍历中选择希望获得的变量

在使用for range循环遍历某个对象时,一般不会同时需要key或者value,这个时候可以采用一些技巧。让代码变得简单。

package main

import "fmt"

func main() {
    m := map[string]int{
        "num1": 12,
        "num2": 13,
        "num3": 14,
    }
    for _, value := range m {
        fmt.Printf("%d\n", value)
    }
}

/*
12
13
14
*/

一个匿名变量的例子

package main

import "fmt"
// 匿名变量
func main() {
    for i, _ := range []int{1,2,3,4} {
        fmt.Printf("key:%d\n",i)
    }
}

3.2.6. 6.range语句中更新引用元素的值

package main

import "fmt"

/*
在"range"语句中生成的数据的值是真实集合元素的拷贝。它们不是原有元素的引用。
这意味着更新这些值将不会修改原来的数据。

同时也意味着使用这些值的地址将不会得到原有数据的指针。
*/
func main() {
    hujianlislice := []int{12, 13, 14}
    for _, i2 := range hujianlislice {
        i2 *= 10
    }
    fmt.Println(hujianlislice)  //[12 13 14]

    // 如果你需要更新原有集合中的数据,使用索引操作符来获得数据
    for i, _ := range hujianlislice {
        hujianlislice[i] *= 10
    }
    fmt.Println(hujianlislice)  //[120 130 140]
}

3.2.7. 7.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 < 100; a++ {
        fmt.Printf("a的值为: %d\n",a)
    }

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

    }

    for index, num := range numbers {
        fmt.Printf("%d : %d\n",index,num)
    }

}