for 循环是用于重复执行某段逻辑的最常用语句之一。在 Go 中,它由 for 关键字、一个头部和一个循环体组成,循环体是包裹在花括号里的代码块。头部由 3 个用分号 ; 分隔的部分组成:初始化、条件和后置。
for init; condition; post {
// loop body - code that is executed repeatedly as long as the condition is true
}
注意: 与其他语言不同,头部的这三个部分周围没有括号 ()。事实上,插入这样的括号会导致编译错误。不过,包裹循环体的花括号 { } 始终是必需的。
for 循环:一个示例初始化部分通常用来设置一个计数器变量,条件部分检查循环应该继续还是停止,后置部分通常在每次重复的末尾让计数器自增。
for i := 1; i < 10; i++ {
fmt.Println(i)
}
这个循环会打印从 1 到 9 的数字(包括 9)。定义步长通常使用自增或自减语句,如上面的示例所示。
你是一位热衷于观鸟的人,一直记录着有多少只鸟造访你的花园。通常你会用笔记本里的计数表来数鸟,不过为了更好地处理数据,你已经把过去几周的鸟类计数数字化了。
我们先用整体的视角来分析这些数据。找出自从开始记录以来,你一共数到了多少只鸟。
实现一个函数TotalBirdCount,它接收一个由int组成的切片,里面是每天的鸟数量。它应该返回你数到的鸟的总数。
birdsPerDay := []int{2, 5, 0, 7, 4, 1, 3, 0, 2, 5, 0, 1, 3, 1}
TotalBirdCount(birdsPerDay)
// => 34
现在你对鸟的数量已经有了大致的了解,你想做更细致的分析。
实现一个函数BirdsInWeek,它接收一个每天鸟数量的切片和一个周次。
它返回你在那一周里数到的鸟的总数。你可以假设每周的记录都是完整的。
birdsPerDay := []int{2, 5, 0, 7, 4, 1, 3, 0, 2, 5, 0, 1, 3, 1}
BirdsInWeek(birdsPerDay, 2)
// => 12
你意识到,在你一直努力记录这些鸟的过程中,有一只鸟一直躲在花园的一个偏僻角落里。
你弄清楚了,这只鸟每隔一天就会待在你的花园里。
你不知道它在中间那些日子去了哪里,但可以肯定它不在你的花园里。
你的观鸟直觉还告诉你,这只鸟在你列表中记录的第一天就在你的花园里。
根据这些新信息,编写一个函数FixBirdCountLog,它接收一个每天鸟数量的切片作为实参,并在修正计数错误之后返回该切片。
birdsPerDay := []int{2, 5, 0, 7, 4, 1}
FixBirdCountLog(birdsPerDay)
// => [3 5 1 7 5 1]