五、流程控制

zhangsen發表於2021-04-20
  1. 順序控制

  2. 分支控制

  3. 迴圈控制

  4. 順序控制

從上到下逐步執行

  1. 分支控制

分支控制就是讓程曦有選擇執行

  1. 單分支

  2. 雙分支

  3. 多分支

  4. 單分支控制

//if 條件表示式 {
//}

func main() {
   var age int
   fmt.Println("請輸入年齡")
   fmt.Scanln(&age)

   if age>18{
      fmt.Println("成年人")
   }
}
  1. 雙分支控制

if 條件表示式 {
    執行程式碼塊1
}else{
    執行程式碼塊2
}

案例:

ax^2+bx+c=0方程的解,a,b,c分別為函式的引數

如果:b^2-4ac>0, 則有兩個解;b^2-4ac=0,則有一個解;b^2-4ac<0,則無解;

提示1:

x_1 = (-b+sqrt(b^2-4ac))/2a

x_2 = (-b-sqrt(b^2-4ac))/2a

提示2:

math.Sqrt(num);可以求平方根,需要引入math包

測試資料:3,100,6

  1. switch分支控制

  2. go中沒有bireak

  3. go中的case可以有多個,用逗號間隔

  4. case\switch後是一個表示式(常量,變數、有返回值的函式)

  5. case後表示式的值型別必須和switch表示式值的型別一致

  6. default不是必須

  7. switch後也可以不帶表示式,型別if-else

  8. switch穿透 fallthrough,也叫switch穿透,在case後增加fallthrough,會繼續執行下一個case(預設只能穿透一層)

  9. switch判斷變數的型別

var key byte
fmt.Scanf("%c",&key)

switch key {
    case 'a':fmt.Println("1")
    case 'b':fmt.Println("2")
    case 'c':fmt.Println("3")
    default:
       fmt.Println("0")
}

switch  test(key)+1 
case 1,2,3,4

不帶表示式

//不帶表示式
var age int = 10
switch  {
case age==90: fmt.Println(1)
case age==80: fmt.Println(2)
default:
   fmt.Println(0)
}

//case對範圍映象判斷
Case age>10 && age<20: fmt.Println(0)

//switch後帶一個宣告的變數,分號結束
switch age := 10;{
    ...
}

switch穿透

var num int =10
switch num {
case 10: fmt.Println(1)
   fallthrough
case 20: fmt.Println(2)
case 30: fmt.Println(3)
}
//10
//20

判斷變數型別

var x interface{}
var y = 10.0
x = y
switch i := x.(type) {
case nil:
   fmt.Printf("%T", i)
case int:
   fmt.Printf("int")
case float64:
   fmt.Printf("float64")
case func(int) float64:
   fmt.Printf("func(int)")
case bool, string:
   fmt.Printf("bool或者string")
}
//float64

小寫轉大寫

var s byte
fmt.Println("請輸入")
fmt.Scanf("%c", &s)
switch s {
case 'a':
   fmt.Println("A")
case 'b':
   fmt.Println("B")
case 'c':
   fmt.Println("C")
case 'd':
   fmt.Println("D")
default:
   fmt.Println("other")
}

例子

//判斷是否及格
var score float64
fmt.Println("請輸入")
fmt.Scanln(&score)
switch int(score / 60) {
case 1:
   fmt.Println("及格")
case 0:
   fmt.Println("不及格")
default:
   fmt.Println("老實點")
}
  1. For

語法格式

//for-demo1
for i := 0; i < 10; i++ {
   fmt.Println("測試")
}

迴圈變數初始化、迴圈條件、迴圈變數迭代

第二種寫法

k := 1
for k <= 10 {
   fmt.Println("測試")
   k++
}

第三種寫法

k := 1
for {
   if k <= 10 {
      fmt.Println("測試")
   } else {
      break
   }
   k++
}
  1. 字串遍歷range

//傳統方式
var str string = "hello golang"
for i := 0; i < len(str); i++ {
   fmt.Printf("%c\n", str[i])
}

//range
var str string = "hello golang"
for k, v := range str {
   fmt.Printf("k=%d,v=%c\n", k, v)
}

但是,漢字遍歷會出錯,遍歷是按位元組來遍歷,一個漢字在utf8中有3個位元組

解決方案:str 轉 []rune 切片,range可以直接遍歷

var str string = "i am in 深圳"
str1 := []rune(str)
for i := 0; i < len(str1); i++ {
   fmt.Printf("%c\n", str1[i])
}

for k, v := range str {
   fmt.Printf("k=%d,v=%c\n", k, v)
}

例子

var max uint64 = 100
var count uint64 = 0
var sum uint64 = 0
var i uint64 = 1
for ; i <= max; i++ {
   if i/9 == 0 {
      count++
      sum += i
   }
}
fmt.Printf("count=%v sum=%v\n", count, sum)
  1. while與do while的實現

  1. 多重迴圈

  2. 記憶體迴圈完才會進入外層迴圈

  3. 迴圈次數:內迴圈+外迴圈

例子:列印乘法表

var num int = 9
for i := 1; i <= num; i++ {
   for j := 1; j <= i; j++ {
      fmt.Printf("%v * %v = %v\t", j, i, j*i)
   }
   fmt.Println()
}
  1. Break

中止當前for迴圈或者switch語句

var count int = 0
for {
   rand.Seed(time.Now().UnixNano())
   n := rand.Intn(100) + 1
   fmt.Println(n)
   count++
   if n == 99 {
      break
   }
}
fmt.Println(count)
  1. break預設會跳出最近的一個迴圈,進入上一層迴圈
  2. 在多層巢狀迴圈中,通過標籤指明要終止的是哪一層語句
label1:
   for i := 0; i < 3; i++ {
      for j := 0; j < 12; j++ {
         if j == 2 {
            //break
            break label1
         }
         fmt.Println(j)
      }
   }
}
  1. continue

  2. 結束本次迴圈,進入下一次迴圈

  3. 可以通過標籤指明要跳過的是哪一層迴圈

label1:
   for i := 0; i < 3; i++ {
      for j := 0; j < 5; j++ {
         if j == 2 {
            continue label1
         }
         fmt.Println(j)
      }
   }

// 01 01 01

for i := 0; i < 3; i++ {
   for j := 0; j < 5; j++ {
      if j == 2 {
         continue
      }
      fmt.Println(j)
   }
}
// 0,1,3,4, 0,1,3,4, 0,1,3,4
  1. 跳轉控制語句goto

  2. goto語句可以無條件的轉移到程式中指定的行

  3. goto語句通常與條件語句配合使用,可用來實現條件轉移,跳出迴圈體等功能

  4. 不主張用goto,以免導致程式流程混亂

var n int = 20
   fmt.Println(1)
   fmt.Println(2)
   if n > 11 {
      goto lable1
   }
   fmt.Println(3)
lable1:
   fmt.Println(4)
   fmt.Println(5)
  1. 跳出控制語句return

在方法或者函式中,表示跳出所在的方法或者函式

本作品採用《CC 協議》,轉載必須註明作者和本文連結