其實和很多語言都是類似的,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語句需要配合標籤一起使用