首页 > 代码库 > Go 高级(if for switch 等)

Go 高级(if for switch 等)

for

Go 只有一种循环结构——`for` 循环。

基本的 for 循环除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中做的一样,而 `{ }` 是必须的。

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

 

for(续)

跟 C 或者 Java 中一样,可以让前置、后置语句为空。

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


for 是 Go 的 “while”

基于此可以省略分号:C 的 while 在 Go 中叫做 `for`。

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

死循环

如果省略了循环条件,循环就不会结束,因此可以用更简洁地形式表达死循环。

package mainfunc main() {	for {	}}

 

if

if 语句除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中的一样,而 `{ }` 是必须的。

(耳熟吗?)

package mainimport (	"fmt"	"math")func sqrt(x float64) string {	if x < 0 {		return sqrt(-x) + "i"	}	return fmt.Sprint(math.Sqrt(x))}func main() {	fmt.Println(sqrt(2), sqrt(-4))}

 

if 的便捷语句

 for 一样,`if` 语句可以在条件之前执行一个简单的语句。

由这个语句定义的变量的作用域仅在 if 范围之内。

(在最后的 return 语句处使用 v 看看。)

package mainimport (	"fmt"	"math")func pow(x, n, lim float64) float64 {	if v := math.Pow(x, n); v < lim {		return v	}	return lim}func main() {	fmt.Println(		pow(3, 2, 10),		pow(3, 3, 20),	)}

 

if 和 else

 if 的便捷语句定义的变量同样可以在任何对应的 else 块中使用。

package mainimport (	"fmt"	"math")func pow(x, n, lim float64) float64 {	if v := math.Pow(x, n); v < lim {		return v	} else {		fmt.Printf("%g >= %g\n", v, lim)	}	// 这里开始就不能使用 v 了	return lim}func main() {	fmt.Println(		pow(3, 2, 10),		pow(3, 3, 20),	)}

 

switch

一个结构体(`struct`)就是一个字段的集合。

除非以 fallthrough 语句结束,否则分支会自动终止。

package mainimport (	"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.", os)	}}

 

switch 的执行顺序

switch 的条件从上到下的执行,当匹配成功的时候停止。

(例如,

switch i {case 0:case f():}

 i==0 时不会调用 `f`。)

注意:Go playground 中的时间总是从 2009-11-10 23:00:00 UTC 开始, 如何校验这个值作为一个练习留给读者完成。

package mainimport (	"fmt"	"time")func main() {	fmt.Println("When‘s Saturday?")	today := time.Now().Weekday()	switch time.Saturday {	case today + 0:		fmt.Println("Today.")	case today + 1:		fmt.Println("Tomorrow.")	case today + 2:		fmt.Println("In two days.")	default:		fmt.Println("Too far away.")	}}

 

没有条件的 switch

没有条件的 switch 同 `switch true` 一样。

这一构造使得可以用更清晰的形式来编写长的 if-then-else 链。

package mainimport (	"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.")	}}