当前位置:   article > 正文

go的for循环应该这么用

go的for循环应该这么用

目录

目录

一:介绍

1: for流程控制

2:for-range流程控制

二:实例展示

1://按照一定次数循环

  2://无限循环

3:   //循环遍历整数、各种容器和通道

4:遍历通道

5://指针数组循环

6:使用continue

7:  协成处理

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://按照一定次数循环

  1.    for i := 1; i<=5; i++ {
  2.         fmt.Println(i)
  3.    }
  2://无限循环
  1.    var j int
  2.    for {
  3.         j += 1
  4.         fmt.Println(1)
  5.         if j == 10 {
  6.             break;
  7.         }
  8.    }
3:   //循环遍历整数、各种容器和通道

 
  1.  arr := [2]string{"苹果","香蕉"}
  2.    for index, value := range arr {
  3.         fmt.Println(index)
  4.         fmt.Println(value)
  5.    }

4:遍历通道
  1. c := make(chan int)
  2. go func() {
  3. for i:=0; i< 10; i++ {
  4. c <- i
  5. }
  6. close(c)
  7. }()
  8. for i := range c {
  9. fmt.Println(i)
  10. }
  11. fmt.Println("done")
5://指针数组循环
  1.  type Goods struct {
  2.     name string
  3.     price float64
  4.  }
  5. allGoods := []*Goods{&Goods{name:"香蕉",price:3.2},&Goods{name:"苹果",price:2.2}}

定义一个结构体是Goods的指针数组,保存每一个实例化结构体的地址,循环读取地址,打印地址的内容

  1.  for _, item := range allGoods {
  2.         
  3.         fmt.Println(*item)
  4.    }

这里有个问题,如果我们在循环中保存结构体的地址到数组指针就会出现问题,看下面的程序

allGoods := []Goods{Goods{name:"香蕉",price:3.2},Goods{name:"苹果",price:2.2}}

我们定义一个结构体数组,循环这个数组,获取每个结构体的地址保存到一个指针数组中

  1. var saleGoods []*Goods
  2.  for _, item := range allGoods {
  3.         saleGoods = append(saleGoods,&item)
  4.    }
  5.   fmt.Println(saleGoods)

正常我们打印出来是一个保存地址的数组,但是发现这个数组只保存最后一个数据的地址,数组的地址是重复的。

解决方法是循环中item的值每次重新赋值

  1. item := item
  2. saleGoods = append(saleGoods,&item)

默认go在循环中,不是变量的迭代,而是循环本身,这个问题在Go 1.22之后得到改善。

6:使用continue
  1. for i := 0; i < 10; i++ {
  2. if i % 2 == 0 {
  3. continue
  4. }
  5. fmt.Print(i)
7:  协成处理
  1. var m = []int{1, 2, 3}
  2. for _,i := range m {
  3. go func(i int) {
  4. fmt.Print(i)
  5. }(i)
  6. }
  7. time.Sleep(time.Millisecond)

但是这样循环是没有顺序的,如果需要按照一定的顺序,该怎么处理呢

8: 循环字典按照顺序

  1. m := map[string]int32{
  2.         "roy":   18,
  3.         "kitty": 16,
  4.         "hugo":  21,
  5.         "tina":  35,
  6.         "jason": 23,
  7.     }
  8.     lst := []string{}
  9.     for k, _ := range m {
  10.         lst = append(lst, k)
  11.     }
  12.     sort.Strings(lst) //排序字符串
  13.     
  14.     for _,i := range lst {
  15.         fmt.Println(m[i])
  16.     }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/317854
推荐阅读
相关标签
  

闽ICP备14008679号