Go语言基础(一)
流程控制语句:for、if、else、switch、defer
for
Go只有一种循环结构: for 循环
基本的for循环由三部分组成,它们用分号隔开:
- 初始化语句:在第一次迭代前执行
- 条件表达式:在每次迭代前求值
- 后置语句:在每次迭代的结尾执行
一个标准的for循环:
func main(){
sum := 0
for i:=0; i < 10; i++{
sum += i
}
fmt.Println(sum)
}
初始化语句通常为一句短变量声明,该变量声明仅在for语句的作用域中可见。
一旦条件表达式的布尔值为false,循环迭代就会终止。
Go的for语句后面没有小括号,大括号{}是必须的
初始化语句和后置语句是可选的。
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
for是Go中的while,此时可以去掉分号。
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
无限循环
如果省略循环条件,该循环就不会结束,因此无限循环可以用以下写法
func main() {
for {
}
}
if
Go的if语句与for循环类似,表达式外无需小括号(),而大括号{}是必须的
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
if的简短语句
同for一样,if语句可以在条件表达式前执行一个简单的语句。
该语句声明的变量作用域仅在if之内
if之外使用报错,如下
if和else
在if的简短语句中声明的变量同样可以在任何对应的else块中使用。
image
switch
switch是编写一连串if-else语句的简便写法。它运行第一个值等于条件表达式的case语句。
Go的switch语句类似于C、C++、Java、Javascript和PHP中的,不过Go只运行选定的case,而非之后所有的case。实际上,Go自动提供了在这些语言中每个case后面所需的break语句。除非以fallthrough语句结束,否则分支会自动终止。Go的另一点重要的不同在于switch的case无需为常量,且取值不必为整数。
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.", os)
}
}
switch的求值顺序
switch的case语句从上到下顺序执行,直到匹配成功时停止。
没有条件的switch
没有条件的switch同switch true一样。
这种形式能将一长串if-then-else写得更加清晰。
func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}
defer
defer语句会将函数推迟到外层函数返回之后执行。
推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
defer栈
推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
result:
counting
done
9
8
7
6
5
4
3
2
1
0
网友评论