2.6 運算符
運算符用于在程序運行時執行數學或邏輯運算。Go語言內置的運算符有算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符和特殊運算符(&是取地址運算符,*是取地址所對應的值的運算符,這與C語言很類似)。在日常的編程中,比較常用的是算術運算符、關系運算符、邏輯運算符和賦值運算符,而位運算符一般用得較少。
運算符和變量或常量等按照一定的次序連接起來構成表達式(Expression),例如算術表達式、邏輯表達式等。下面分別對Go語言內置的運算符進行詳細說明。
2.6.1 算術運算符
算術運算符可以在數值間進行四則運算,也就是加減乘除等操作。下面是算術運算符基本用法的示例程序2-15。
示例程序2-15 算術運算符基本用法:chapter02\code07\opt_num.go

在示例程序2-15中,需要注意的是:Go語言的自增運算符++和自減運算符--,它們不能出現在表達式的末尾,也就是說,數值的自增和自減操作不能賦值給其他變量。Go語言中沒有內置的求冪(Power)函數,需要開發者自行實現。
注意
在Go語言中,整數類型和浮點類型的變量不能直接進行四則運算,否則會報類型不匹配的錯誤。
2.6.2 關系運算符
關系運算符用來比較兩個值的大小關系,例如大于、小于、大于等于,等等。關系運算符的結果總是布爾值,即要么是true,要么是false。下面是關系運算符基本用法的示例程序2-16。
示例程序2-16 關系運算符基本用法:chapter02\code07\opt_relation.go

在示例程序2-16中,第05行聲明了兩個整數類型的變量a和b,并把11和2分別賦值給它們。07行用關系運算符==來比較變量a和b的值是否相等,同時將判斷結果賦值給新聲明的變量c。從程序中可以看出關系運算符“==”的優先級高于變量賦值運算符“:=”。
注意
在Go語言中,整數類型和浮點類型的變量不能直接進行大小比較,否則會報類型不匹配的錯誤。
2.6.3 邏輯運算符
邏輯運算符有非(!)、與(&&)和或(||)3種。邏輯運算符&&和||是雙目運算符,兩邊表達式的結果值必須是true或者false。邏輯非總是取后綴值的相反值;邏輯與運算符兩邊表達式的結果都是true,邏輯運算的結果值才為true,只要有一個為false則邏輯運算的結果值為false;邏輯或運算符兩邊表達式的結果都是false,邏輯運算的結果值才為false,只要有一個為true則邏輯運算的結果值為true。下面是邏輯運算符基本用法的示例程序2-17。
示例程序2-17 邏輯運算符基本用法:chapter02\code07\opt_logic.go

在示例程序2-17中,第05行先聲明了兩個整數類型的變量a和b,并把11和2分別賦值給它們。第06行聲明了一個布爾類型的變量isOk,并將它賦值為false。第09行輸出表達式a > b &&isOk的邏輯值,由于&&是邏輯與運算符,操作數全為true時這個邏輯表達式的結果才能為true,因為其中的isOk為false,所以表達式的結果為false。另外,從這個表達式也能推斷出關系運算符的優先級比邏輯運算符的優先級高。
注意
在Go語言中,邏輯運算符只能作用于布爾類型的值,不能對整數類型等數據進行操作,比如!0。
2.6.4 位運算符
位運算符是對整數在內存中的二進制位進行操作,一般情況下,位運算符使用的比較少。位運算符有按位與(&)、按位或(|)、按位異或(^)、左移(<<)和右移(>>)。下面是位運算符基本用法的示例程序2-18。
示例程序2-18 位運算符基本用法:chapter02\code07\opt_bit.go

在示例程序2-18中,為了清晰地說明位運算符,第06行聲明了兩個二進制格式的變量a和b,其值分別為0b00111100、0b10001101。其中,0b打頭表示該數值是二進制表示法。第08行輸出a&b的值。按位與運算符只有對應二進制位的數都為1,運算結果才為1,否則為0,因此,a&b運算結果值的二進制表示為00001100,即1100,如圖2.11所示。

圖2.11 a和b位運算示意圖
2.6.5 賦值運算符
在對變量進行賦值時,就要用到賦值運算符,它的種類也比較多,上面講的算術運算符、邏輯運算符、關系運算符和位運算符幾乎(不是全部,除了!單目運算符)都可以與基本的賦值運算符(=)進行組合,生成新的復合賦值運算符。下面是賦值運算符基本用法的示例程序2-19。
示例程序2-19 賦值運算符基本用法:chapter02\code07\opt_assign.go

2.6.6 特殊運算符
在Go語言中,存在兩個特殊的運算符,即&和*:&是取地址運算符;*是取地址所對應的值的運算符。這里需要注意與位運算符&和算術運算符*的區別。如果學過C語言,那么對這個特殊運算符會更好理解一點。下面是特殊運算符基本用法的示例程序2-20。
示例程序2-20 特殊運算符基本用法:chapter02\code07\opt_other.go

在示例程序2-20中,第05行聲明了兩個變量a和b,其中a是整數類型、b是字符串類型。第07行和第08行分別用&a和&b獲取變量a和b的內存地址。第09行和第10行分別打印輸出這兩個內存地址,這里需要注意的是打印的內存地址會根據編譯的計算機不同而有所差異。第12行和第13行用*p和*p1來間接引用目標對象a和b。因此,第14行輸出了變量a的值2,而第15行輸出了變量b的值Hello。
2.6.7 運算符的優先級
在四則運算中,先計算乘除后計算加減,說明乘除運算符的優先級比加減運算符的優先級高。所謂優先級,就是當多個運算符出現在同一個表達式中時運算符執行次序的高低。
Go語言有幾十種運算符,被分成十幾個優先級,有的運算符優先級不同,有的運算符優先級相同,如表2.1所示。
表2.1 Go運算符優先級

優先級值越大,表示優先級越高,比如優先級12的乘除比優先級11的加減優先級高。對于復雜的表達式,記住表2.1中所有的優先級是很難的,而且代碼可讀性很差。我們可以通過使用括號來改變某個表達式的整體運算優先級,并使得表達式的可讀性更好。