Go语言流程控制篇二

/ Go技术 / 没有评论 / 458浏览

gopher

流程控制

for

例如:

package main

import "fmt"

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

for(续)

package main

import "fmt"

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

for 是 Go 的 “while”

package main

import "fmt"

func main() {
	sum := 3

	for sum < 1000{
		sum += sum
	}
	fmt.Println(sum)
}

死循环

package main

func main() {
	for{
		
	}
}

if

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 的便捷语句

package main

import (
	"fmt"
	"math"
	)

func pow(x,n,limit float64) float64{
	if v := math.Pow(x,n); v < limit{
		return v
	}
	return limit
}

func main() {
	fmt.Println(
		pow(3,2,10),
		pow(3,4,10),
	)
}

注意:这里的v作用范围只在if范围之内

if 和 else

package main

import (
	"fmt"
	"math"
)

func pow(x, n, limit float64)float64  {
	if v := math.Pow(x,n); v < limit{
		return v
	} else{
		fmt.Printf("%g >= %g\n",v,limit)
	}
	return limit
}

func main() {
	fmt.Println(
		pow(3, 2, 10),
		pow(3, 3, 20),
	)
}

执行结果:

27 >= 20
9 20

注意:(提示:两个 pow 调用都在 main 调用 fmt.Println 前执行完毕了。)

练习:循环和函数

package main

import "fmt"

func Sqrt(x float64)float64{
	z := float64(1)
	for i := 0; i < 10;i++{
		z = z - (z*z-x)/2*z
	}
	return z
}

func main() {
	fmt.Println(
		Sqrt(2),
	)
}

switch

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("Go runs on ")
	switch os := runtime.GOOS; os{
	case "darwin":
		fmt.Println("OS X.")
	case "linux":
		fmt.Println("Linux.")
	default:
		fmt.Printf("%s\n",os)
	
	}
}

switch 的执行顺序

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

i==0 时不会调用 f

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("Go runs on ")
	switch os := runtime.GOOS; os{
	case "darwin":
		fmt.Println("OS X.")
	case "linux":
		fmt.Println("Linux.")
	default:
		fmt.Printf("%s\n",os)
		
	}
}

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

没有条件的 switch

package main

import (
	"fmt"
	"time"
)

func main() {
	today := time.Now()
	switch {
	case today.Hour() < 12:
		fmt.Println("Good morning.")
	case today.Hour() < 17:
		fmt.Println("Good aftertoon.")
	default:
		fmt.Println("Good evening.")
	}
}

defer

  1. defer 语句会延迟函数的执行直到上层函数返回。
  2. 延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用。
package main
     
     import "fmt"
     
     func main() {
     	defer fmt.Println("world")
     	fmt.Println("Hello")
     }

__注意:简单的理解第二点,就上面的例子,也就是知道main()返回前都不会调用defer fmt.Println("world")

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
7
6
5
4
3
2
1
0