Golang学习笔记_08——For循环

news/2024/12/14 15:20:01/

Golang学习笔记_05——延迟调用
Golang学习笔记_06——变量和常量
Golang学习笔记_07——基本类型


文章目录

    • For循环
      • 1. 基本形式
      • 2. 省略形式
      • 3. While循环
      • 4. 无限循环
      • 5. 使用 `range` 进行迭代
    • 源码


For循环

在Go语言中,for 循环是唯一的一种循环结构,它非常灵活,可以用于实现传统的 for 循环、while 循环以及 do-while 循环。

1. 基本形式

Go 只有一种循环结构:for 循环。

基本的 for 循环由三部分组成,它们用分号隔开:

  • 初始化语句:在第一次迭代前执行
  • 条件表达式:在每次迭代前求值
  • 后置语句:在每次迭代的结尾执行

初始化语句通常为一句短变量声明,该变量声明仅在 for 语句的作用域中可见。

一旦条件表达式求值为 false,循环迭代就会终止。

注意:和 C、Java、JavaScript 之类的语言不同,Go 的 for 语句后面的三个构成部分外没有小括号, 大括号 { } 则是必须的。

func basicDemo() {for i := 0; i < 10; i++ {fmt.Println("i = :", i)}
}

测试方法

func Test_basicDemo(t *testing.T) {basicDemo()
}

输出结果

=== RUN   Test_basicDemo
i = : 0
i = : 1
i = : 2
i = : 3
i = : 4
i = : 5
i = : 6
i = : 7
i = : 8
i = : 9
--- PASS: Test_basicDemo (0.00s)
PASS

2. 省略形式

在for循环的基础形式上,初始化语句和后置语句是可选的。

func omissionForDemo() {var i = 15for ; i > 2;  {fmt.Println("i = ", i)i %= 2}
}

测试方法

func Test_omissionForDemo(t *testing.T) {omissionForDemo()
}

输出结果

=== RUN   Test_omissionForDemo
i =  1
--- PASS: Test_omissionForDemo (0.00s)
PASS

3. While循环

如果省略初始化语句和后处理语句,for 循环将类似于传统的 while 循环

此时你可以去掉分号,因为 C 的 while 在 Go 中叫做 for

func whileDemo() {var sum = 0for sum < 10 {sum += 1fmt.Println("sum = ", sum)}
}

测试方法

func Test_whileDemo(t *testing.T) {whileDemo()
}

输出结果

=== RUN   Test_whileDemo
sum =  1
sum =  2
sum =  3
sum =  4
sum =  5
sum =  6
sum =  7
sum =  8
sum =  9
sum =  10
--- PASS: Test_whileDemo (0.00s)
PASS

4. 无限循环

如果省略循环条件,for 循环将变成无限循环,类似于 do-while 循环(不过 do-while 是在循环体执行后才检查条件,而 Go 语言的无限循环需要手动控制退出)

func infiniteLoopDemo() {var sum = 100for {fmt.Println("sum = ", sum)sum -= 10if sum < 0 {break}}
}

测试方法

func Test_infiniteLoopDemo(t *testing.T) {infiniteLoopDemo()
}

输出结果

=== RUN   Test_infiniteLoopDemo
sum =  100
sum =  90
sum =  80
sum =  70
sum =  60
sum =  50
sum =  40
sum =  30
sum =  20
sum =  10
sum =  0
--- PASS: Test_infiniteLoopDemo (0.00s)
PASS

5. 使用 range 进行迭代

for 循环还可以与 range 关键字结合使用,用于迭代数组、切片、字符串、映射(map)和通道(channel)

func forRangeDemo() {nums := []int{1, 2, 3, 4, 5}for index, value := range nums {fmt.Printf("Index: %d, Value: %d\n", index, value)}// 迭代字符串str := "hello"for index, runeValue := range str {fmt.Printf("%#U starts at byte position %d\n", runeValue, index)}// 迭代mapm := map[string]int{"a": 1, "b": 2, "c": 3}for key, value := range m {fmt.Printf("Key: %s, Value: %d\n", key, value)}
}

测试方法

func Test_forRangeDemo(t *testing.T) {forRangeDemo()
}

输出结果

=== RUN   Test_forRangeDemo
Index: 0, Value: 1
Index: 1, Value: 2
Index: 2, Value: 3
Index: 3, Value: 4
Index: 4, Value: 5
U+0068 'h' starts at byte position 0
U+0065 'e' starts at byte position 1
U+006C 'l' starts at byte position 2
U+006C 'l' starts at byte position 3
U+006F 'o' starts at byte position 4
Key: a, Value: 1
Key: b, Value: 2
Key: c, Value: 3
--- PASS: Test_forRangeDemo (0.00s)
PASS

源码

// for_demo.go 文件package for_demoimport "fmt"func basicDemo() {for i := 0; i < 10; i++ {fmt.Println("i = :", i)}
}func omissionForDemo() {var i = 15for i > 2 {i %= 2fmt.Println("i = ", i)}
}func whileDemo() {var sum = 0for sum < 10 {sum += 1fmt.Println("sum = ", sum)}}func infiniteLoopDemo() {var sum = 100for {fmt.Println("sum = ", sum)sum -= 10if sum < 0 {break}}
}func forRangeDemo() {nums := []int{1, 2, 3, 4, 5}for index, value := range nums {fmt.Printf("Index: %d, Value: %d\n", index, value)}// 迭代字符串str := "hello"for index, runeValue := range str {fmt.Printf("%#U starts at byte position %d\n", runeValue, index)}// 迭代mapm := map[string]int{"a": 1, "b": 2, "c": 3}for key, value := range m {fmt.Printf("Key: %s, Value: %d\n", key, value)}
}
// for_demo_test.go 文件
package for_demoimport "testing"func Test_basicDemo(t *testing.T) {basicDemo()
}func Test_omissionForDemo(t *testing.T) {omissionForDemo()
}func Test_whileDemo(t *testing.T) {whileDemo()
}func Test_infiniteLoopDemo(t *testing.T) {infiniteLoopDemo()
}func Test_forRangeDemo(t *testing.T) {forRangeDemo()
}

http://www.ppmy.cn/news/1555047.html

相关文章

chattts生成的音频与字幕修改完善,每段字幕对应不同颜色的视频,准备下一步插入视频。

上一节中&#xff0c;实现了先生成一个固定背景的与音频长度一致的视频&#xff0c;然后插入字幕。再合并成一个视频的方法。 但是&#xff1a;这样有点单了&#xff0c;所以&#xff1a; 1.根据字幕的长度先生成视频片断 2.在片段上加上字幕。 3.合并所有片断&#xff0c;…

.NET(C#) 如何配置用户首选项及保存用户设置

最近开发软件&#xff0c;需要将用户设置保存下来以便下次打开后再用&#xff0c;看了半天原来.NET框架自带setting功能。记录如下&#xff1a; 一&#xff0c;“设置” 页面 使用项目设计器的“设置”页指定项目的应用程序设置。 通过应用程序设置&#xff0c;能够为应用程序…

如何切换安卓手机ip?你更喜欢哪种操作

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于网络访问和隐私保护至关重要。有时&#xff0c;可能出于个人需求或工作缘故&#xff0c;想要将自己的安卓手机IP地址更换成其他省份的&#xff0c;或者设置成静态IP等需求该如何实现呢&#xff1f;安卓手…

通信协议 http、tcp、udp

目录 1. 五层网络协议 2. http 3. tcp、udp 4. tcp 3次握手、4次挥手 5. socket 6. httpclient 遇到的问题 1. Q: 使用 EntityUtils.toString(responseEntity, "UTF-8") 中文乱码 2. Q: org.apache.http.NoHttpResponseException: 221.6.16.203:8890 failed …

深入探索数据库世界:SQLite、Redis、MySQL 与数据库设计范式

数据库 深入探索数据库世界:SQLite、Redis、MySQL 与数据库设计范式一、SQLite 数据库全方位解析(一)创建与基本操作(二)数据存储与表结构设计(三)数据操作:增删改查(四)与 C 语言联合使用(五)防止 SQL 注入二、Redis 数据库深度剖析(一)数据存储类型与独特结构(…

pstree 查看进程树 命令学习

使用Centos7.6 系统 使用yum安装 使用 yum -y install pstree 下载时会报错&#xff0c;因为 pstree 命令的包名不是这个&#xff0c;使用 yum provides pstree 可以查看pstree属于哪个包&#xff0c;然后安装它。 Loaded plugins: fastestmirror Repository epel is listed mo…

pandas:常用函数

1.groupby groupby 是 pandas 中一个非常强大的函数&#xff0c;它允许你按照某个列&#xff08;或多列&#xff09;的值对数据集进行分组&#xff0c;然后对每个组应用聚合函数。以下是 groupby 的基础介绍和用法示例。 基础介绍 groupby 函数通常用于以下情况&#xff1a;…

【[LeetCode每日一题】Leetcode 1768.交替合并字符串

Leetcode 1768.交替合并字符串 题目描述&#xff1a; 给定两个字符串 word1 和 word2&#xff0c;以交替的方式将它们合并成一个新的字符串。即&#xff0c;第一个字符来自 word1&#xff0c;第二个字符来自 word2&#xff0c;第三个字符来自 word1&#xff0c;依此类推。如果…