Golang学习笔记_08——For循环

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


文章目录

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

For循环

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

1. 基本形式

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

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

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

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

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

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

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

测试方法

go 复制代码
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循环的基础形式上,初始化语句和后置语句是可选的。

go 复制代码
func omissionForDemo() {
	var i = 15

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

测试方法

go 复制代码
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

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

测试方法

go 复制代码
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 语言的无限循环需要手动控制退出)

go 复制代码
func infiniteLoopDemo() {
	var sum = 100

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

测试方法

go 复制代码
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)

go 复制代码
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)
	}

	// 迭代map
	m := map[string]int{"a": 1, "b": 2, "c": 3}
	for key, value := range m {
		fmt.Printf("Key: %s, Value: %d\n", key, value)
	}
}

测试方法

go 复制代码
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

源码

go 复制代码
// for_demo.go 文件

package for_demo

import "fmt"

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

func omissionForDemo() {
	var i = 15

	for i > 2 {

		i %= 2
		fmt.Println("i = ", i)
	}
}

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

}

func infiniteLoopDemo() {
	var sum = 100

	for {
		fmt.Println("sum = ", sum)
		sum -= 10
		if 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)
	}

	// 迭代map
	m := map[string]int{"a": 1, "b": 2, "c": 3}
	for key, value := range m {
		fmt.Printf("Key: %s, Value: %d\n", key, value)
	}
}
go 复制代码
// for_demo_test.go 文件
package for_demo

import "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()
}
相关推荐
小雪崩17 分钟前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip
知识分享小能手31 分钟前
深度学习学习教程,从入门到精通,概率与信息论 — 知识点详解(3)
人工智能·深度学习·学习·数据挖掘·概率论
李燚31 分钟前
把规则搬回家:三个 BC 的贫血→充血重构实录(第103篇)
golang·agent·ddd·领域驱动设计·eino·deepflux·eino adk
Wendy不吃榴莲36 分钟前
# AI短剧教程 - 《后西游记》开播后,AI影视为什么更考验“连续讲故事”?
人工智能·笔记·学习·ai·视频
Agudamu116141 分钟前
B站学习视频怎么变笔记:用 Ai好记 + Obsidian 搭建个人知识库的完整教程
人工智能·笔记·学习·音视频
kkkkkkkkkk_Z1 小时前
学嵌入式和Linux应用编程|学习日记:计算机网络基础
linux·学习·计算机网络
麦田里的粮仓1 小时前
图形设计工具箱(免费开源)
学习
每天题库1 小时前
交安C证报考条件有哪些?公路水运安全员C证报名时间及考试科目
学习·安全·考试·题库·考证
lifallen2 小时前
长任务怎样选择遗忘:clearing、compaction 与 memory
人工智能·学习·ai·ai编程
高亦真2 小时前
今天是学习嵌入式的第35天
linux·学习·算法