golang常用手冊:運算子、條件語句、迴圈語句

pc859107393發表於2017-12-21

其實和很多語言都是類似的,go語言也是有運算子、條件語句和迴圈語句。

運算子(這一點和c相同)

Go 語言內建的運算子:

  • 算術運算子
    • +、-、*、/、%、++、--
  • 關係運算子
    • ==、!=、>、<、>=、<=、
  • 邏輯運算子
    • &&、||、!
  • 位運算子
    • &、|、^
  • 賦值運算子
    • =、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、!=
  • 其他運算子
    • &(取地址)、*(指標取值)

當然,運算子也是有優先順序的。

條件語句

正如其他語言,go中也存在一下條件語句:

  • if
  • if ··· else
  • if ··· else if ··· else
  • if (if ··· [(else if)、(if)])
  • switch () { case value1: ··· [fallthrough] ··· }
  • select

注意,在這裡我們除了常規的if語句操作相同以外,其他都是類似。

switch注意點如下:

  • 左花括號{必須與switch處於同一行
  • 條件表示式不限制為常量或者整數
  • 單個case中,可以出現多個結果選項
  • 與C語言等規則相反,Go語言不需要用break來明確退出一個case
  • 只有在case中明確新增fallthrough關鍵字,才會繼續執行緊跟的下一個case
  • 可以不設定switch之後的條件表示式,在此種情況下,整個switch結構與多個if...else...的邏輯作用等同

select注意點如下:

  • elect 的程式碼形式和 switch 非常相似
  • 每個case都必須是一個通訊
  • 所有channel表示式都會被求值
  • 所有被髮送的表示式都會被求值
  • 如果任意某個通訊可以進行,它就執行;其他被忽略。否則如下:
  • 如果有多個case都可以執行,Select會隨機公平地選出一個執行。
    • 如果有default子句,則執行該語句。
    • 如果沒有default字句,select將阻塞,直到某個通訊可以執行;Go不會重新對channel或值進行求值。

選擇語句

  • for init; condition; post { } (和 C 語言的 一般for 一樣)
  • for condition { } (和 C 的 while 一樣)
  • for { } ==> (跟C語言for(;;){} 相同)
    • init: 一般為賦值表示式,給控制變數賦初值;
    • condition: 關係表示式或邏輯表示式,迴圈控制條件;
    • post: 一般為賦值表示式,給控制變數增量或減量。
  • for 迴圈的 range 格式可以對 slice、map、陣列、字串等進行迭代迴圈。
    • for key, value := range oldMap { newMap[key] = value }

注意,for迴圈條件控制器是無需括號的,迴圈體需要花括號包裹,迴圈變數、迴圈調教、迴圈變數變化量之間用 ; 分割。

demo如下:

package main

//導包
import (
	"fmt"
)

func main() {
	numbers := [6]int{1, 2, 3, 5}
	for i := range numbers {
		fmt.Printf("第 %d 位 x 的值 = %d\n", i, numbers[i])
	}

	fmt.Println("====我是分割線====")

	for i, x := range numbers {
		fmt.Printf("第 %d 位 x 的值 = %d\n", i, x)
	}

	fmt.Println("====我是分割線====")

	for a := 0; a < len(numbers); a++ {
		fmt.Printf("第 %d 位 x 的值 = %d\n", a, numbers[a])
	}
}
複製程式碼

當然我們能夠小小的推測一下結果,這裡直接貼出結果如下:

第 0 位 x 的值 = 1
第 1 位 x 的值 = 2
第 2 位 x 的值 = 3
第 3 位 x 的值 = 5
第 4 位 x 的值 = 0
第 5 位 x 的值 = 0
====我是分割線====
第 0 位 x 的值 = 1
第 1 位 x 的值 = 2
第 2 位 x 的值 = 3
第 3 位 x 的值 = 5
第 4 位 x 的值 = 0
第 5 位 x 的值 = 0
====我是分割線====
第 0 位 x 的值 = 1
第 1 位 x 的值 = 2
第 2 位 x 的值 = 3
第 3 位 x 的值 = 5
第 4 位 x 的值 = 0
第 5 位 x 的值 = 0
複製程式碼

當然,我們說到迴圈,不得不提一下迴圈控制語句,如下:

  • break
  • continue
  • goto

值得一提的是,break和continue都和其他語言中的用法類似。但是個別一些語言中不存在goto或者很少使用。goto示例如下:

/* 定義區域性變數 */
   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
複製程式碼

我們簡易的看一下goto語法:label: statement; ··· goto label

也就是說我們給某處語句打上 label 標籤,使用goto則會跳轉到該語句。

總結:

  • 運算子和其他語言一樣沒什麼區別
  • 條件語句中多出一個值得注意的select語句,且主要用於io操作中
  • 迴圈語句也和其他語言類似,需要注意的是goto語句需要配合標籤一起使用

相關文章