目录
目录
[1: for流程控制](#1: for流程控制)
[3: //循环遍历整数、各种容器和通道](#3: //循环遍历整数、各种容器和通道)
[7: 协成处理](#7: 协成处理)
[8: 循环字典按照顺序](#8: 循环字典按照顺序)
一:介绍
go中的循环有for和for range两种循环结构,for循环结构
1: for流程控制
for InitSimpleStatement; Condition; PostSimpleStatement {
// do something
}
在一个for循环代码块中,
InitSimpleStatement(初始化语句)和PostSimpleStatement(步尾语句)两个部分必须均为简单语句,并且PostSimpleStatement不能为一个变量短声明语句。
Condition必须为一个结果为布尔值的表达式(它被称为条件表达式)。
所有这三个刚提到的部分都是可选的。和很多其它流行语言不同,在Go中上述三部分不能用小括号括在一起。
2:for-range流程控制
for-range流程控制代码块可以用来遍历整数、各种容器和通道等。
注意:使用for-range流程控制代码块来遍历整数是从Go 1.22才开始支持的。
二:实例展示
1://按照一定次数循环
Go
for i := 1; i<=5; i++ {
fmt.Println(i)
}
2://无限循环
Go
var j int
for {
j += 1
fmt.Println(1)
if j == 10 {
break;
}
}
3: //循环遍历整数、各种容器和通道
Go
arr := [2]string{"苹果","香蕉"}
for index, value := range arr {
fmt.Println(index)
fmt.Println(value)
}
4:遍历通道
Go
c := make(chan int)
go func() {
for i:=0; i< 10; i++ {
c <- i
}
close(c)
}()
for i := range c {
fmt.Println(i)
}
fmt.Println("done")
5://指针数组循环
Go
type Goods struct {
name string
price float64
}
allGoods := []*Goods{&Goods{name:"香蕉",price:3.2},&Goods{name:"苹果",price:2.2}}
定义一个结构体是Goods的指针数组,保存每一个实例化结构体的地址,循环读取地址,打印地址的内容
Go
for _, item := range allGoods {
fmt.Println(*item)
}
这里有个问题,如果我们在循环中保存结构体的地址到数组指针就会出现问题,看下面的程序
Go
allGoods := []Goods{Goods{name:"香蕉",price:3.2},Goods{name:"苹果",price:2.2}}
我们定义一个结构体数组,循环这个数组,获取每个结构体的地址保存到一个指针数组中
Go
var saleGoods []*Goods
for _, item := range allGoods {
saleGoods = append(saleGoods,&item)
}
fmt.Println(saleGoods)
正常我们打印出来是一个保存地址的数组,但是发现这个数组只保存最后一个数据的地址,数组的地址是重复的。
解决方法是循环中item的值每次重新赋值
Go
item := item
saleGoods = append(saleGoods,&item)
默认go在循环中,不是变量的迭代,而是循环本身,这个问题在Go 1.22之后得到改善。
6:使用continue
Go
for i := 0; i < 10; i++ {
if i % 2 == 0 {
continue
}
fmt.Print(i)
7: 协成处理
Go
var m = []int{1, 2, 3}
for _,i := range m {
go func(i int) {
fmt.Print(i)
}(i)
}
time.Sleep(time.Millisecond)
但是这样循环是没有顺序的,如果需要按照一定的顺序,该怎么处理呢
8: 循环字典按照顺序
Go
m := map[string]int32{
"roy": 18,
"kitty": 16,
"hugo": 21,
"tina": 35,
"jason": 23,
}
lst := []string{}
for k, _ := range m {
lst = append(lst, k)
}
sort.Strings(lst) //排序字符串
for _,i := range lst {
fmt.Println(m[i])
}