Contents
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)
}
}