Go基础笔记

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之外使用报错,如下

image

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

你可能感兴趣的:(Go基础笔记)