Go語言表達式
表達式表達的是一個計算過程,參與該計算過程的有數值、常量與變量、操作符(包括運算符)、函數等,表達式最終計算的結果一般是一個數值。簡單地說,表達式就是通過一組計算獲取某個結果值的算式。
1.1 最簡單的表達式——單個數值
由於表達式最終計算的結果是一個數值,因此也可以反過來說,程序中代表一個數值的內容都可以看作表達式,單個數值也可以看作一個表達式,是一個沒有運算操作的表達式。由於單個常量或變量也是用於存儲數值的,所以單個常量或變量也可以算作一個表達式。
18 -26.08 0xFFEE "abcde" true false Pi a number1
1.2 操作符在表達式中的作用
通過組合數值和操作符,可以組成更復雜的表達式。
3+15
這是一個表達式,表示兩個數字相加的計算過程。這個表達式中用到了一個加法操作符,可以看出該操作符的作用是將其前后兩個數值進行加法計算后獲得一個結果值,也就是通過數學上的 “求和” 計算獲得結果值。
像加號這樣需要前后兩個數值參數與該計算操作的操作符叫作 "二元操作符"。Go 語言中除了二元操作符之外,還有"一元操作符",也就是只需要一個數值參與計算的操作符:
!true
典型的一元操作符還有表示正負的 "+" ,"-" 號,以及表示內存地址取值的 "&" 符號等。
-
+、-、*、/
分別對應數學中的加減乘除號。
-
==、!=、>、>=、<、<=
"==" 和 “!=” 分別是條件判斷中判斷兩個數值是否相等還是不等的操作符,將返回一個布爾類型的結果 true 或 false。
-
%
百分號 "%" 作為操作符的時候作用是 "取模",也就是求一個數除以另一個數的余數,例如 5 對 3 取模用表達式表示是 5 % 3,其結果為 2。
-
&、|、^、&^
這幾個符號作為兩個數值之間的操作符時,其作用是讓兩個數進行二進制形式按位進行的 "與" "或" "異或" "與非" 操作。以按位 "與" 操作為例。
如果兩個數字分別為 1 和 2,則表示按位 "與" 操作的表達式是 1 & 2。其他操作符類似。
-
>>、<<
">>" 和 "<<" 則是對一個數字進行二進制位的 "移位" 操作。所謂 "移位",指的是將各個二進制位的數字一同向某個方向移動的一個位置,移動后溢出的二進制位上的數字被丟棄,而空出來的那個位置會補充一個二進制的 0。
">>"代表左移,"<<"代表右移。移位操作符后面的數字表示移動幾位。
-
&&、||、!
""&&" "||" "!" 操作符分別叫作 "邏輯與" "邏輯或" "邏輯非" 操作符。
"邏輯與" "邏輯或" 的作用是將其前后的兩個布爾類型數值做 "與" 和 "或" 的操作,與 "按位與" 和 "按位或" 操作類似,但並非對二進制位進行操作。
"邏輯與"操作的含義是:如果兩個布爾型數值都是true,則結果為true,否則為false。
"邏輯或"操作的含義是:如果兩個布爾型數值至少有一個是ture,則結果為true,否則為false。
"邏輯非"操作的含義是:將一個布爾值進行取反操作,即如果是true,則變為false,如果是false則變為true。
1.3 函數在表達式中的作用
函數在表達式中的作用與操作符類似,甚至可以把操作符看做簡化的函數。這是因為可以把操作符看作是接受 1 個或 2 個參數並返回 1 個數值的函數。
1.4 表達式的組合與計算的優先級
表達式通過組合可以稱為更復雜的表達式
16-7*18
這是一個含有 3 個數值和 2 個操作符的表達式。計算機在計算表達式的時候有一定的優先級順序,就像我們在數學算式中乘法的優先級高於加減法一樣。這個算式在算計中將先計算 7 * 18,這個字表達式的值,再將結果與 16 進行減法運算。
計算機中的優先級順序的規則如下:
- 函數優先級最高
- 其次是一元運算符
- 再次是二元操作符,二元操作符之間的運算優先級如下:
- *、/、%、<<、>>、&、&^ 等優先級最高;
- ==、!=、<、<=、>、>= 再次之
- &&;
- ||
- 相同優先級的操作符或函數,將按照從左到右的順序依次進行計算。
- 表達式中可以通過圓括號改變計算的優先級,最里層嵌套的圓括號內的子表達式運算優先級是最高的,然后是較外層的圓括號,並如此逐級向外進行雲算。
- 函數參數中如果有表達式,則每個參數獨立進行計算(即僅將后傳入函數作為參數,不作為函數外部的表達式成分)。
1.5 表達式中數據類型的一致性要求
在 Go 語言中,很多二元操作符要求參與該操作的兩個數值類型一致:
package main import ( "fmt" ) func main() { fmt.Printf("%v", 15+25.6) a := 15 b := 25.6 fmt.Printf("%v", a+b) }
上面代碼中,第一條 Printf 語句是正確的,第二天 Printf 是錯誤的。
這是因為對於第一個 Printf 語句中的表達式 15+25.6,Go 語言會自動將兩個數字都認為是浮點數而進行加法操作。
而第二個表達式中的變量 a 在之前已經通過 := 操作符自動被認為是 int 類型的變量,而 b 則是 float64 類型,兩者是不允許進行加法操作的。
如果一定要改變這種約束,例如要求計算一個整數與浮點數的相加結果,可以使用自定義函數的方式,但其內部的實質還是要經過類型轉換變為同一類型再進行加法操作。