Go 高级(if for switch 等)

for

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

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

package main



import "fmt"



func main() {

	sum := 0

	for i := 0; i < 10; i++ {

		sum += i

	}

	fmt.Println(sum)

}

 

for(续)

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

package main



import "fmt"



func main() {

	sum := 1

	for ; sum < 1000; {

		sum += sum

	}

	fmt.Println(sum)

}


for 是 Go 的 “while”

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

package main



import "fmt"



func main() {

	sum := 1

	for sum < 1000 {

		sum += sum

	}

	fmt.Println(sum)

}

死循环

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

package main



func main() {

	for {

	}

}

 

if

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

(耳熟吗?)

package main



import (

	"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 main



import (

	"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 main



import (

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

	}

}

 

switch 的执行顺序

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

(例如,

switch i {

case 0:

case f():

}

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

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

package main



import (

	"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 main



import (

	"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.")

	}

}

 

 

 

你可能感兴趣的:(switch)