从零开始的go世界(2)

205 阅读1分钟

for

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

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

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

注意:Go 的 for 语句后面的三个构成部分外没有小括号, 大括号 { } 则是必须的。

package main
import "fmt"

func main(){
    var sum int = 0
    for i:=0 ; i<10 ; i++ {
        sum += i
    }
    fmt.Println(sum)
}

while

C 的 while 在 Go 中叫做 for

package main

import "fmt"

func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
	fmt.Println(sum)
}

if

Go 的 if 语句与 for 循环类似,表达式外无需小括号 ( ) ,而大括号 { } 则是必须的。

package main
import "fmt"

func main(){
    var num := 10
    if num < 10{
        fmt.Println("Hi World")
    }
}

if 的简短语句

同 for 一样, if 语句可以在条件表达式前执行一个简单的语句。

该语句声明的变量作用域仅在 if 之内。

package main
import (
    "fmt"
    "math"
)

func main(){
    if v := math.Pow(1); v < 1{
        fmt.Println("OK")
    }
}

if 和 else

在 if 的简短语句中声明的变量同样可以在任何对应的 else 块中使用。

package main
import "fmt"

func main(){
    if v := math.Pow(1); v < lim {
	fmt.Println(v)
    } else {
	fmt.Printf("%g >= %g\n", v, lim)
    }
}

switch

Go 自动提供了在这些语言中每个 case 后面所需的 break 语句。 除非以 fallthrough 语句结束,否则分支会自动终止。 Go 的另一点重要的不同在于 switch 的 case 无需为常量,且取值不必为整数。

package main

import (
	"fmt"
	"runtime"
)
func main() {
    switch os := runtime.GOOS; os {
        case "darwin":
            fmt.Println("OS X.")
        case "Linux":
             fmt.Println("Linux.")
        default:
             fmt.Println("end")
    }
}

没有条件的switch

package main

import (
	"fmt"
	"time"
)

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 语句会将函数推迟到外层函数返回之后执行。

推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用

package main
import "fmt"

func main(){
    defer fmt.Println("world")
    fmt.Println("hello")
}

defer 栈

推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。

package main

import "fmt"

func main() {
	fmt.Println("counting")

	for i := 0; i < 10; i++ {
		defer fmt.Println(i)
	}

	fmt.Println("done")
}