banner
Pi3

Pi3

记录学习、生活和成长
github
telegram
x
zhihu
email

Go語言入門7:循環語句

Go 語言入門基礎學習筆記之 Go 語言的循環語句

golang

循環語句#

for 循環#

Go 語言的 For 循環有 3 種形式,只有其中的一種使用分號

  1. 和 C 語言的 for 一樣:
for init; condition; post { }
  • init: 一般為賦值表達式,給控制變量賦初值;
  • condition關係表達式或邏輯表達式,循環控制條件;
  • post: 一般為賦值表達式,給控制變量增量或減量。

init 和 post 參數是可選的,我們可以直接省略它,類似 While 語句。

  1. 和 C 的 while 一樣:
for condition { }
  1. 和 C 的 for(;;) 一樣:
// 無限循環
for { } 
// 或者
for true { }

範圍 Range

for 循環的 range 格式可以對 slice、map、數組、字符串等進行迭代循環。

for key, value := range oldMap {
    newMap[key] = value
}

以上代碼中的 key 和 value 是可以省略。

如果只想讀取 key,格式如下:

for key := range oldMap
// 或者
for key, _ := range oldMap

如果只想讀取 value,格式如下:

for _, value := range oldMap

因為 Go 語言中所有聲明的變量都必須被使用,因此可以使用 _ 來替代。

循環控制語句#

控制語句描述
break 語句經常用於中斷當前 for 循環或跳出 switch 語句
continue 語句跳過當前循環的剩餘語句,然後繼續進行下一輪循環。
goto 語句將控制轉移到被標記的語句。

break 語句#

在 Go 語言中,break 語句用於終止當前循環或者 switch 語句的執行,並跳出該循環或者 switch 語句的代碼塊。

break 語句可以用於以下幾個方面:

  • 用於循環語句中跳出循環,並開始執行循環之後的語句。
  • break 在 switch 語句中在執行一條 case 後跳出語句的作用。
  • break 可應用在 select 語句中,用於跳出 select 語句不再執行。
  • 在多重循環中,可以用標號 label 標出想 break 的循環。

多重循環中使用標記不使用標記的區別:

package main

import "fmt"

func main() {

   // 不使用標記
   fmt.Println("---- break ----")
   for i := 1; i <= 3; i++ {
      fmt.Printf("i: %d\n", i)
      for i2 := 11; i2 <= 13; i2++ {
         fmt.Printf("i2: %d\n", i2)
         break
      }
   }

   // 使用標記
   fmt.Println("---- break label ----")
   re:
      for i := 1; i <= 3; i++ {
         fmt.Printf("i: %d\n", i)
         for i2 := 11; i2 <= 13; i2++ {
         fmt.Printf("i2: %d\n", i2)
         break re
      }
   }
}

// 輸出結果
---- break ----
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11
---- break label ----
i: 1
i2: 11

由此可知,不使用標記的 break 只能跳出當前的循環。而使用標記的 break 可以指定跳出的循環。

在 Go 語言中,break 語句在 select 語句中的應用是相對特殊的。由於 select 語句的特性,有些情況 break 語句並不能直接用於跳出 select 語句本身,因為 select 語句是非阻塞的,它會一直等待所有的通信操作都準備就緒。

正如以下實例,select 被嵌套在一個無限循環語句中,因此 break 語句只會跳出 select 語句,而不會跳出外層的 for 循環。如果你想跳出外層的 for 循環,可以使用 break + 標籤 (標記) 來實現。除此之外也可以使用 return 或者 goto 語句。

當然相同情況下的 switch 語句也可以使用這三種辦法

package main

import (
    "fmt"
    "time"
)

func process(ch chan int) {
Loop:
    for {
        select {
        case val := <-ch:
            fmt.Println("Received value:", val)
            // 執行一些邏輯
            if val == 5 {
                break Loop
                // 或者用 return 提前結束當前函數執行
                // 也可以用 goto EndLoop 跳到函數最後一行
            }
        default:
            fmt.Println("No value received yet.")
            time.Sleep(500 * time.Millisecond)
        }
    }
EndLoop:
}

func main() {
    ch := make(chan int)

    go process(ch)

    time.Sleep(2 * time.Second)
    ch <- 1
    time.Sleep(1 * time.Second)
    ch <- 3
    time.Sleep(1 * time.Second)
    ch <- 5
    time.Sleep(1 * time.Second)
    ch <- 7

    time.Sleep(2 * time.Second)
}

// 輸出結果
No value received yet.
No value received yet.
Received value: 1
No value received yet.
Received value: 3
No value received yet.
Received value: 5

continue 語句#

Go 語言的 continue 語句有點像 break 語句。但是 continue 不是跳出循環,而是跳過當前循環執行下一次循環語句。

在多重循環中,可以用標號 label 標出想 continue 的循環。

多重循環使用標記不使用標記的區別:

package main

import "fmt"

func main() {

    // 不使用標記
    fmt.Println("---- continue ---- ")
    for i := 1; i <= 3; i++ {
        fmt.Printf("i: %d\n", i)
            for i2 := 11; i2 <= 13; i2++ {
                fmt.Printf("i2: %d\n", i2)
                continue
            }
    }

    // 使用標記
    fmt.Println("---- continue label ----")
    re:
        for i := 1; i <= 3; i++ {
            fmt.Printf("i: %d\n", i)
                for i2 := 11; i2 <= 13; i2++ {
                    fmt.Printf("i2: %d\n", i2)
                    continue re
                }
        }
}

// 輸出結果
---- continue ---- 
i: 1
i2: 11
i2: 12
i2: 13
i: 2
i2: 11
i2: 12
i2: 13
i: 3
i2: 11
i2: 12
i2: 13
---- continue label ----
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11

goto 語句#

Go 語言的 goto 語句可以無條件地轉移到過程中指定的行。

goto 語句通常與條件語句配合使用。可用來實現條件轉移、構成循環、跳出循環體等功能。

但是,在結構化程序設計中一般不主張使用 goto 語句,以免造成程序流程的混亂,使理解和調試程序都產生困難

package main

import "fmt"

func main() {
   /* 定義局部變量 */
   var a int = 10

   /* 循環 */
   LOOP: for a < 20 {
      if a == 15 {
         /* 跳過迭代 */
         a = a + 1
         goto LOOP
      }
      fmt.Printf("a的值為 : %d\n", a)
      a++     
   }  
}

// 輸出結果
a的值為 : 10
a的值為 : 11
a的值為 : 12
a的值為 : 13
a的值為 : 14
a的值為 : 16
a的值為 : 17
a的值為 : 18
a的值為 : 19
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。