Golang流程控制


在這裏插入圖片描述

1. 概述

程序中的流程控制語句,用於設置程序的執行次序,體現程序執行流程的實現部分,建立程序的基本邏輯結構.

2. 條件判斷分支- if

Go語言中使用 if 關鍵字進行條件判斷 ,條件判斷的語句終值爲 true 或者 false

2.1 單分支

語法格式 :

if 表達式 {

分支1

}

package main

import "fmt"

func main(){
	var condition  bool  = true
	age := 19
	if condition {
		fmt.Println("condition is true ")
	}
	if age >= 18{
		fmt.Println("成年人的世界,沒有容易二字")
	}
	// 也可以使用 ! 進行反向判斷
	if !(1>2){
		fmt.Println("1不大於2")
	}

}

$ go run main.go
condition is true 
成年人的世界,沒有容易二字
1不大於2

if 後面的條件判斷語句可以是一個表達式

package main

import "fmt"

func compareNum(x, y int) bool {
	if x < y {
		return false
	}
	return true
}
func main() {
	// if 後面的可以是一個表達式
	if month := 8; month <= 9 {
		fmt.Printf("現在是%d月份\n", month)
	}
	x := 90
	y := 10
    // 也是一個表達式
	if compareNum(x, y) {
		fmt.Printf("x = %d 大於 y = %d\n", x, y)
	}

}

$ go run main.go
現在是8月份
x = 90 大於 y = 10

2.2 雙分支

語法格式 :

if 表達式{

​ 分支1

}else{

​ 分支2

}

package main

import "fmt"

func main(){
	var age int
	fmt.Println("請輸入年齡[0~120] : ")
	fmt.Scanln(&age)
	if age >18{
		fmt.Println("成年人")
	}else{
		fmt.Println("未成年人")
	}
}

$ go run main.go
請輸入年齡[0~120] : 
99
成年人

注意 if後面跟的表達式的形式的最終結果是bool類型,不論表達式以怎麼樣的形式出現

package main

import "fmt"

func main() {
	var n1 float64 = 89.99
	var n2 float64 = 10.01
	b := true
	if n1 >= 88.00 || n2 < 11.00 && (n1+n2) > 99.99 && b {
		fmt.Println("條件都滿足")
	} else {
		fmt.Println("條件都不滿足")
	}
}

$ go run main.go
條件都滿足

2.3 多分支

多分支控制

if 表達式1 {

​ 分支1

}else if 表達式2{

​ 分支2

}else if 表達式3{

​ 分支3

}…

package main

import "fmt"

func main() {
	var score int
	fmt.Println("請輸入學生分數[0~100] : ")
	fmt.Scanln(&score)
	if score > 100 || score < 0 {
		fmt.Println("分數範圍不正確")
	} else if score >= 90 {
		fmt.Println("成績優秀")
	} else if score >= 80 {
		fmt.Println("成績良好")
	} else if score >= 70{
		fmt.Println("成績普通")
	} else if score >= 60 {
		fmt.Println("成績及格")
	}else{
		fmt.Println("成績不及格")
	}
}

$ go run main.go
請輸入學生分數[0~100] : 
76
成績普通

3. 條件選擇分支- switch

switch是根據不同的執行條件,執行不同的邏輯分支代碼,每個case分支都是唯一的,自上而下逐一匹配

  • switch 和case 的表達式可以是 常量,變量,也可以是表達式
  • Go語言中的switch語句中的case分支,結尾處不需要break(和其他編程語言有區別)
  • case後面表達式的數據類型,必須和switch的表達式一致
  • case後面的表達式可以是多個,使用逗號隔開
  • switch中default 也可以不需要
  • switch後面也可以沒有表式,此種情況下整個switch結構和if…else…邏輯作用等同

示例1

package main

import "fmt"

func main(){
	var n int
	fmt.Println("please input number[1~7]: ")
	fmt.Scanln(&n)
	switch n {
	case 1:
		fmt.Println("Monday")
	case 2:
		fmt.Println("Tuesday")
	case 3:
		fmt.Println("Wednesday")
	case 4:
		fmt.Println("Thursday")
	case 5:
		fmt.Println("Friday")
	case 6:
		fmt.Println("Saturday")
	case 7 :
		fmt.Println("Sunday")
	default :
		fmt.Println("Unknown")
	}
}

$go run main.go
please input number[1~7]: 
7
Sunday

示例2

package main

import "fmt"

func main(){
	var n int
	fmt.Println("please input number[1~10]: ")
	fmt.Scanln(&n)
	switch n {
	case 2,4,6,8,10:
		fmt.Println("even number")
	case 1,3,5,7,9:
		fmt.Println("Odd number")
	default :
		fmt.Println("Unknown")
	}

}

示例3

package main

import "fmt"

func compareNum(x, y int) int {
	if x > y {
		return x
	} else if y > x {
		return y
	}
	return 0
}
func main() {
	var x int
	var y int
	fmt.Println("input two number x = ? and y = ?:")
	fmt.Scanln(&x, &y)
	switch {
	case compareNum(x, y) == x:
		fmt.Println("x is big")
	case compareNum(x, y) == y:
		fmt.Println("y is big")
	case compareNum(x, y) == 0:
		fmt.Println("x == y")
	}
}

$ go run main.go
input two number x = ? and y = ?:
90 90
x == y

fallthrough穿透 : 在case語句後面增加fallthrough會繼續執行下一個case的內容

package main

import "fmt"

func main() {
	var passWorld string = "root123456"
	switch {
	case passWorld == "root123456":
		fmt.Println("passworld is ok")
		fallthrough
	case passWorld != "root123456":
		fmt.Println("passworld is error")
		fallthrough
	default:
		fmt.Println("passworld is null")
	}
}

$ go run main.go
passworld is ok
passworld is error
passworld is null

4. 循環控制-for

Go語言循環只支for關鍵字,不支持while和do…while結構

語法格式

for 循環變量初始化 ; 循環控制條件 ; 循環變量變化語句{

​ 循環體語句

}

  • 一般的for 循環中循環體不斷的執行,直到循環控制條件不成立,for循環結束
  • for循環可以通過break ,goto,return,panic等語句退出循環
  • 無限循環也是通過for關鍵字實現,通常會配合一些結束條件

4.1 標準的for循環

package main

import "fmt"

func main(){
	// 求1到100整數的累加和
	// 寫法1 標準的for循環寫法
	var sum1 int = 0
	for i:=1;i<=100 ;i++  {
		sum1 += i
	}
	fmt.Println("寫法1:從1累加到100的和是 : ",sum1)

	// 寫法2
	var sum2 int = 0
	i := 1
	for i<=100{
		sum2 +=i
		i++
	}
	fmt.Println("寫法2:從1累加到100的和是 : ",sum2)
	// 寫法3
	var sum3 int = 0
	j := 1
	for ;;j++{
		if j>100{
			break
		}
		sum3 += j
	}
	fmt.Println("寫法3:從1累加到100的和是 : ",sum3)

}

$ go run main.go
寫法1:從1累加到100的和是 :  5050
寫法2:從1累加到100的和是 :  5050
寫法3:從1累加到100的和是 :  5050

4.2 for 無限循環

實現類似do…while

package main

import "fmt"

func main(){
	i:= 0
	for{
		if i>10{
			break
		}
		fmt.Println("i = ",i)
		i++
	}
}

$ go run main.go
i =  0
i =  1
i =  2
i =  3
i =  4
i =  5
i =  6
i =  7
i =  8
i =  9
i =  10

4.3 for 循環嵌套

package main

import "fmt"

func main() {
	// 打印一個九九乘法表
	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d X %d = %d\t", j, i, i*j)
		}
		fmt.Println()
	}
}

$ go run main.go
1 X 1 = 1	
1 X 2 = 2	2 X 2 = 4	
1 X 3 = 3	2 X 3 = 6	3 X 3 = 9	
1 X 4 = 4	2 X 4 = 8	3 X 4 = 12	4 X 4 = 16	
1 X 5 = 5	2 X 5 = 10	3 X 5 = 15	4 X 5 = 20	5 X 5 = 25	
1 X 6 = 6	2 X 6 = 12	3 X 6 = 18	4 X 6 = 24	5 X 6 = 30	6 X 6 = 36	
1 X 7 = 7	2 X 7 = 14	3 X 7 = 21	4 X 7 = 28	5 X 7 = 35	6 X 7 = 42	7 X 7 = 49	
1 X 8 = 8	2 X 8 = 16	3 X 8 = 24	4 X 8 = 32	5 X 8 = 40	6 X 8 = 48	7 X 8 = 56	8 X 8 = 64	
1 X 9 = 9	2 X 9 = 18	3 X 9 = 27	4 X 9 = 36	5 X 9 = 45	6 X 9 = 54	7 X 9 = 63	8 X 9 = 72	9 X 9 = 81	

4.4 for-range 遍歷

for循環配合for…range語句結構可以遍歷字符串,數組,切片,map和通道(channel)

package main

import "fmt"

func main() {
	// for-range遍歷
	// 遍歷字符串
	var str string = "golang中國"
	fmt.Println("遍歷字符串 :")
	for k, v := range str {
		fmt.Printf("%d==>%c\t", k, v)
	}
	//遍歷數組
	var arr = [...]string{"one", "two", "three"}
	fmt.Printf("\n遍歷數組 :\n")
	for k, v := range arr {
		fmt.Printf("%d==>%s\t", k, v)
	}
	// 遍歷切片
	var sli []string = []string{"A", "B", "C"}
	fmt.Printf("\n遍歷切片 :\n")
	for k, v := range sli {
		fmt.Printf("%d==>%s\t", k, v)
	}
	fmt.Printf("\n遍歷map :\n")
	// 遍歷map
	var personalInfo = map[string]string{
		"name":   "tom",
		"addr":   "beijing",
		"cardNo": "471823781238812389X",
	}
	for k, v := range personalInfo {
		fmt.Printf("%s:%s\n", k, v)
	}

}

$ go run main.go
遍歷字符串 :
0==>g	1==>o	2==>l	3==>a	4==>n	5==>g	6==>中	9==>國	
遍歷數組 :
0==>one	1==>two	2==>three	
遍歷切片 :
0==>A	1==>B	2==>C	
遍歷map :
addr:beijing
cardNo:471823781238812389X
name:tom

遍歷channel

package main

import "fmt"

func main() {
	c := make(chan string)
	go func() {
		c<-"AA"
		c<-"BB"
		c<-"CC"
		c<-"DD"
		close(c)
	}()
	for v := range c{
		fmt.Println(v)
	}
}

$ go run main.go
AA
BB
CC
DD

5. 循環控制

5.1 break

break 語句可以結束for 的代碼塊,break 可以在後面添加標籤,表示退出某個標籤的代碼塊

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main(){
	// 初始化一個變量當做計數器
	count := 0
	for{
		rand.Seed(time.Now().UnixNano())
		n := rand.Intn(10000)+1
		fmt.Println("n = ",n)
		count++
		if n == 88{
			break
		}
	}
	fmt.Printf("生成88一共執行了%d次",count)
}

$ go run main.go
n =  88
生成88一共執行了468640次

break 通過標籤指明要終止的語句塊

  • break 默認跳出最近的for循環
  • break 指定跳出標籤,跳出標籤對應的for循環
package main

import "fmt"

func main() {
	LL_1:
	for i := 0; i < 5; i++ {
		fmt.Printf("i=%d\n",i)
		LL_2:
		for j := 0; j <= 10; j++ {
			fmt.Printf("\tj=%d\n",j)
			if i == 2{
				break LL_1
			}
			for k:=0;k<=10 ;k++  {
				fmt.Printf("\t\tk=%d\n",k)
				if  k == 3{
					break LL_2
				}
			}
		}
	}
	fmt.Println("golang")
}

$ go run main.go
i=0
	j=0
		k=0
		k=1
		k=2
		k=3
i=1
	j=0
		k=0
		k=1
		k=2
		k=3
i=2
	j=0
golang

5.2 continue

continue語句表示跳出本次循環,進入下一個循環中

package main

import "fmt"

func main(){
	for i:=0;i<=10;i++{
		for j:=0;j<10;j++{
			if (i*j)%2==0{
				continue
			}
			fmt.Printf("%d * %d = %d\n",j,i,j*i)
		}
	}
}

continue 後面也可添加標籤, 指明要跳過那一層循環

package main

import "fmt"

func main(){
	LOOP:
	for i:=0;i<=5;i++{
		for j:=0;j<5;j++{
			switch j {
			case  2:
				fmt.Println(i,j)
			continue LOOP
			}
		}
	}
}

$ go run main.go
0 2
1 2
2 2
3 2
4 2
5 2

6. 跳轉

Go語言中goto語句可以直接跳轉到指定的行

package main

import "fmt"

func main() {
 	for i:= 0;i<20 ;i++{
 		fmt.Println("Loop :",i)
 		if i == 5{
 			goto Here
		}
	}
 	fmt.Println("A")
 	fmt.Println("B")
 	Here:
 		fmt.Println("it is over")
 	fmt.Println("main process is over")
}


$ go run main.go
Loop : 0
Loop : 1
Loop : 2
Loop : 3
Loop : 4
Loop : 5
it is over
main process is over

goto的一個應用場景 : 錯誤統一處理

package main

import (
	"errors"
	"fmt"
)

func checkError1()error{
	return errors.New("checkError_1 error")
}
func checkError2()error{
	return errors.New("checkError_2 error")
}
func main(){
	err := checkError1()
	if err != nil{
		goto operateError
	}
	err = checkError2()
	if err != nil{
		goto operateError
	}
	fmt.Println("program is ok")
	operateError:
		fmt.Println(err)
}

$ go run main.go
checkError_1 error
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章