for
Go中只有一种循环结构:for循环
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
基本的 for 循环由三部分组成,它们用分号隔开:
-
初始化语句:在第一次迭代前执行
-
条件表达式:在每次迭代前求值
-
后置语句:在每次迭代的结尾执行
初始化语句和后置语句是可选的, 可以实现while的功能
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
上面的条件表达式的
;可以去掉
无限循环, 如果省略条件,循环就不会结束.
package main
func main() {
for {
}
}
if
Go的if语句和for循环类似, 表达式不需要小括号, 大括号是必须的.
package main
import "fmt"
func main() {
sum := 0
for {
sum += 1
if sum == 100 {
break
}
}
fmt.Println(sum) // 100
}
if的简短语句, 和for一样,if语句可以在表达式前执行一个简单的语句,该语句声明的变量作用域仅在if之内.
package main
import "fmt"
func judge_number(x int) {
if v := x; v < 10 {
fmt.Printf("%v小于10\n", v)
} else {
fmt.Printf("%v大于等于10\n", v)
}
//fmt.Println(v) //undefined: v; v不能在if之外使用
}
func main() {
judge_number(20) //20大于等于10
judge_number(6) //6小于10
}
if 和 else, 在if简短声明的变量可以再任何对应的else块中使用.
switch
switch 是编写一连串 if - else 语句的简便方法。它运行第一个值等于条件表达式的 case 语句。
Go 只运行选定的 case,而非之后所有的 case。 实际上,Go 自动提供了在这些语言中每个 case 后面所需的 break 语句。 除非以 fallthrough 语句结束,否则分支会自动终止。 Go 的另一点重要的不同在于 switch 的 case 无需为常量,且取值不必为整数。
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.\n", os)
}
}
switch的求值顺序, 从上到下顺序执行,直到匹配成功时停止.
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("什么时候周六")
today := time.Now().Weekday()
fmt.Println(today)
switch time.Saturday {
case today + 0:
fmt.Println("今天")
case today + 1:
fmt.Println("明天")
case today + 2:
fmt.Println("2天后")
default:
fmt.Println("还有好几天")
}
}
没有条件的switch, 和switch true一样,
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("早上好")
case t.Hour() < 17:
fmt.Println("下午好")
default:
fmt.Println("晚上好")
}
}
defer
defer会将函数退出到外层函数返回后执行, 推迟调用的函数的参数会立刻求值, 但直到外层函数返回前该函数都不会被调用.
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
//counting
//done
//9
//8
// ...
//0
}
扫码关注我们
学习更多Golang知识
不负春光 不负自己
戳“阅读原文”我们一起进步