go的for循环应该这么用

目录

目录

一:介绍

[1: for流程控制](#1: for流程控制)

2:for-range流程控制

二:实例展示

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

2://无限循环

[3: //循环遍历整数、各种容器和通道](#3: //循环遍历整数、各种容器和通道)

4:遍历通道

5://指针数组循环

6:使用continue

[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])
    }
相关推荐
小厂永远得不到的男人几秒前
一篇文章搞懂 java 反射
java·后端
蒋星熠11 分钟前
Rust 异步生态实战:Tokio 调度、Pin/Unpin 与零拷贝 I/O
人工智能·后端·python·深度学习·rust
公众号_醉鱼Java17 分钟前
Elasticsearch文档数迷思:深度解析count与stats背后机制
后端
Warren9825 分钟前
公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
java·开发语言·前端·javascript·vue.js·python·安全
David爱编程29 分钟前
Java 编译期 vs 运行期:避开这些坑,少掉一半 Bug
java·后端
·白小白34 分钟前
【数据结构】——栈(Stack)的原理与实现
c语言·开发语言·数据结构
麦兜*1 小时前
Spring Boot调用优化版AI推理微服务 集成 NVIDIA NIM指南
java·人工智能·spring boot·后端·spring cloud·微服务·ai编程
野犬寒鸦1 小时前
Java Stream API 中常用方法复习及项目实战示例
java·服务器·开发语言·数据库
提笔惊蚂蚁2 小时前
Python 高级语法
开发语言·python
Moonbit2 小时前
# 量子位 AI 沙龙回顾丨用 MoonBit Pilot 解答 AI Coding 的未来
后端