go☞004控制流

阅读量: zyh 2020-10-04 20:01:44
Categories: > Tags:

if

package main

import "fmt"

func givemeanumber() int {
    return -1
}

func main() {
    if num := givemeanumber(); num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has only one digit")
    } else {
        fmt.Println(num, "has multiple digits")
    }
}

在上述代码中,num 变量是在 if 中声明的,因此它的作用域仅限于 if 中。这种写法在 go 中很常见。

switch

switch 旨在避免维护含有多个 if 的语句。

☠case 后不可跟条件表达式,只能跟值

switch 变量/常量 {
    case 值1:
        ...
    case 值2, 值3:
        ...
    default:
        ...
}

在上述代码中,若case后面的值若匹配变量,就执行对应代码,否则执行default代码。default语句不是必须的。

🤷‍♂️需要注意的是,switch 关键词后的变量类型和case后的值类型要保持一致。如果不一致,则编译将失败。

☠case 后跟条件表达式,switch 后不可有变量

switch {
    case 条件1:
        ...
    case 条件2:
        ...
    default:
        ...
}

在上述代码中,若条件为真,就执行对应代码,否则执行default代码

package main

import (
    "fmt"
    "time"
)

func main() {
    switch time.Now().Weekday().String() {
    case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday":
        fmt.Println("It's time to learn some Go.")
    default:
        fmt.Println("It's weekend, time to rest!")
    }

    fmt.Println(time.Now().Weekday().String())
}

switch:fallthrough

fallthrough关键词

当某个case上下文中包含fallthrough的话,则会直接执行紧邻的下一条case且不判断条件。

package main

import (
    "fmt"
)

func main() {
    switch num := 15; {
    case num < 50:
        fmt.Printf("%d is less than 50\n", num)
        fallthrough
    case num > 100:
        fmt.Printf("%d is greater than 100\n", num)
        fallthrough
    case num < 200:
        fmt.Printf("%d is less than 200", num)
    }
}
15 is less than 50
15 is greater than 100
15 is less than 200

for

func main(){
    sum := 0
    for i := 0; i < 100; i++ {
        sum += 1
    }
    fmt.Printf("result: %d\n", sum)
}

go 没有 while 关键词。不过,可以用 for 去模拟。

for 后可以直接跟条件表达式,表达式为 true 的时候,循环就不会结束;

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    var num int64
    rand.Seed(time.Now().Unix())
    for num != 5 {
        num = rand.Int63n(15)
        fmt.Println(num)
    }
}

若 for 后面没有任何表达式,则循环永远不会结束,除非循环体中包含 break。

另外,循环体中遇到 continue 将终止当前迭代,直接进入下次循环。