欢迎来到:Google资深工程师深度讲解Go语言
视频地址:Google资深工程师深度讲解Go语言 -循环for结构
基本语法要点:
- for,if 后面的条件没有括号
- if 条件里也可以定义变量
- 没有 while
- switch 不需要break, 也可以直接switch多个条件
最简单的基于计数器的迭代,基本形式为:
for 初始化语句; 条件语句; 修饰语句 {}
for 结构的第二种形式是没有头部的条件判断迭代(类似其它语言中的 while 循环),基本形式:for 条件语句 {}
条件语句是可以被省略的,如 i:=0; ; i++ 或 for { } 或 for ;; { }(;; 会在使用 gofmt 时被移除):这些循环的本质就是无限循环。最后一个形式也可以被改写为 for true { },但一般情况下都会直接写 for { }
。
如果 for 循环的头部没有条件语句,那么就会认为条件永远为 true,因此循环体内必须有相关的条件判断以确保会在某个时刻退出循环。
想要直接退出循环体,可以使用 break 语句或 return 语句直接返回。
但这两者之间有所区别,break 只是退出当前的循环体,而 return 语句提前对函数进行返回,不会执行后续的代码。
无限循环的经典应用是服务器,用于不断等待和接受新的请求。
for t, err = p.Token(); err == nil; t, err = p.Token() {
…
}
示例:test5-for.go
package main
import (
"strconv"
"os"
"bufio"
"fmt"
)
//转二进制
func convertToBin(n int) string {
result := ""
for ;n >0 ; n /= 2 {
lsb := n % 2
result = strconv.Itoa(lsb) + result
}
return result
}
func sum() int {
sum := 0
for i :=1;i<=100 ; i++ {
sum += i
}
return sum
}
//省略初始条件,相当于while
func printFile(filename string) {
file,err := os.Open(filename)
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan(){
fmt.Println(scanner.Text())
}
}
//死循环
func forever() {
for {
fmt.Println("abc")
}
}
func main() {
fmt.Println(
convertToBin(5), //101
convertToBin(13),//
)
fmt.Printf("sum:%d\n",sum())
printFile("abc.txt")
}
在目录下,新建文本文件:abc.txt
for-range 结构在后面会提到。
这是 Go 特有的一种的迭代结构,您会发现它在许多情况下都非常有用。它可以迭代任何一个集合(包括数组和 map,详见第 7 和 8 章)。语法上很类似其它语言中 foreach 语句,但您依旧可以获得每次迭代所对应的索引。一般形式为:
for ix, val := range coll { }
。
参考文档,Go入门指南:for结构