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 将终止当前迭代,直接进入下次循环。