go-learn基础03流程控制

117 阅读2分钟

for

Go中只有一种循环结构:for循环

package main


import "fmt"


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



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

  • 初始化语句:在第一次迭代前执行

  • 条件表达式:在每次迭代前求值

  • 后置语句:在每次迭代的结尾执行

初始化语句和后置语句是可选的, 可以实现while的功能

package main


import "fmt"


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

上面的条件表达式的;可以去掉

无限循环, 如果省略条件,循环就不会结束.

package main


func main() {
	for {
	}
}

if

Go的if语句和for循环类似, 表达式不需要小括号, 大括号是必须的.

package main


import "fmt"


func main() {
	sum := 0
	for {
		sum += 1
		if sum == 100 {
			break
		}
	}
	fmt.Println(sum)  // 100
}

if的简短语句, 和for一样,if语句可以在表达式前执行一个简单的语句,该语句声明的变量作用域仅在if之内.

package main


import "fmt"


func judge_number(x int) {
	if v := x; v < 10 {
		fmt.Printf("%v小于10\n", v)
	} else {
		fmt.Printf("%v大于等于10\n", v)
	}
  //fmt.Println(v)  //undefined: v; v不能在if之外使用
}


func main() {
	judge_number(20) //20大于等于10
	judge_number(6)  //6小于10
}

ifelse, 在if简短声明的变量可以再任何对应的else块中使用.

switch

switch 是编写一连串 if - else 语句的简便方法。它运行第一个值等于条件表达式的 case 语句。

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

package main


import (
	"fmt"
	"runtime"
)


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.\n", os)
	}
}

switch的求值顺序, 从上到下顺序执行,直到匹配成功时停止.

package main


import (
	"fmt"
	"time"
)


func main() {
	fmt.Println("什么时候周六")
	today := time.Now().Weekday()
	fmt.Println(today)
	switch time.Saturday {
	case today + 0:
		fmt.Println("今天")
	case today + 1:
		fmt.Println("明天")
	case today + 2:
		fmt.Println("2天后")
	default:
		fmt.Println("还有好几天")
	}
}

没有条件的switch, 和switch true一样,

package main


import (
	"fmt"
	"time"
)


func main() {
	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("早上好")
	case t.Hour() < 17:
		fmt.Println("下午好")
	default:
		fmt.Println("晚上好")
	}
}

defer

defer会将函数退出到外层函数返回后执行, 推迟调用的函数的参数会立刻求值, 但直到外层函数返回前该函数都不会被调用.

package main


import "fmt"


func main() {
	fmt.Println("counting")
	for i := 0; i < 10; i++ {
		defer fmt.Println(i)
	}
	fmt.Println("done")
	//counting
	//done
	//9
	//8
	// ...
	//0
}



扫码关注我们

学习更多Golang知识

不负春光 不负自己

戳“阅读原文”我们一起进步