1.概述
用于完成特定運算語法標識。例如 + - * /
等虐唠。
基于不同的功能搀愧,分成很多類:
- 算術(shù)運算
- 關(guān)系運算
- 邏輯運算
- 位運算
- 賦值運算
2.算術(shù)運算
+ - * / % ++ --
針對的是數(shù)值類型,其中%取余操作僅僅針對于整型疆偿。
v++
相當于 v=v+1
v--
相當于 v=v–1
v := 10
v ++
fmt.Println(v) // 11
注意:
- 不支持咱筛,
v ++
參與直接運算,也就是v = v + v++
杆故,將v++
直接作為值去參與運算是
不被允許的迅箩。因為v++
作為語句看待,而不是作為表達式看待处铛。 -
+
還支持字符串的連接饲趋。
3.關(guān)系運算
關(guān)系,用于衡量兩個數(shù)據(jù)是否滿足某個特定的邏輯關(guān)系的運算符撤蟆。滿足關(guān)系返回真 true奕塑,
不滿足關(guān)系返回家 false。(關(guān)系運算符永遠返回布爾數(shù)據(jù))
關(guān)系運算符如下表:
注意:
- 返回的永遠是布爾型數(shù)據(jù)家肯。
- 不是全部的數(shù)據(jù)類型龄砰,都支持以上的運算符。
- 參與比較的運算符類型需要一致讨衣。(字符串和int 不能比)
- 字符串類型的比較寝贡,基于每個字節(jié)的碼值做比較扒披,第一個不同的字節(jié)確定大小。(與長度等其他因素無關(guān))
代碼演示:
fmt.Println(10 > 8) // true
fmt.Println(10 > 20) // false
fmt.Println(10. > 8.5) // true
fmt.Println(10.1 < 20) // true
//fmt.Println(true > false) // 不能比較大小關(guān)系
fmt.Println(true == false) // 可以比較是否相等 false
fmt.Println("abc" > "abd") // false
fmt.Println("abc" > "abb") // true
fmt.Println("abc" > "b") // false
fmt.Println("abc" > "") // true
fmt.Println("abc" > "ab") // true
fmt.Println("abc" > "100") // true
fmt.Println("abc" > "ABC") // true
fmt.Println([3]int{1} == [3]int{2}) // false
4.邏輯運算
用于計算多個條件間組合邏輯關(guān)系的運算符圃泡。參與運算的運算數(shù)為可以得到布爾值的表
達式碟案,運算結(jié)果為布爾值。
支持的邏輯運算符:
代碼演示:
fmt.Println(false || false) // false
fmt.Println(true && false) // false
fmt.Println(!(false || false)) // true
fmt.Println(false || (true || false && true)) // true
4.賦值運算
等號颇蜡,完成賦值价说。
賦值運算符還可以配合一些二元運算符,完成自賦值運算风秤。等號左邊稱之為左值鳖目,右邊稱之 為右值。右值需要是一個表達式缤弦,左值是一個變量领迈。
(二元運算符,有 2 個運算符參與運算的符號碍沐,例如加減乘除)
運算符列表:
自賦值:
v := 42
v+=10 相當于 v=v+10
v = 52
批量操作:
v1, v2, v3 := 1, 2, 3
v1, v2, v3 = 4, 5, 6
批量賦值狸捅,是依次計算右值表達式的值,完畢后再 為左值變量賦值累提。
代碼演示:
//賦值
v := 10
v1, v2, v3 := v, v+10, v+20
fmt.Println(v1, v2, v3) // 10 20 30
// 注意 :是全算完后再賦值
v1, v2, v3 = 5, v1 + 10, v2 + 10
fmt.Println(v1, v2, v3) // 5 20 30
// 過程 5, 10+10, 20+10
// 過程 v1=5, v2=20, v3=30
5. 位算符
1)規(guī)則
位尘喝,bit,運算的最基本單位斋陪。 每個位只有 0 或 1 兩種可能性朽褪。
支持的運算符與邏輯運算符類似,&, |, ^, &^, <<, >>无虚。
邏輯運算是對布爾值 true 或 false 的 運算缔赠,而位運算是對數(shù)字 0,1 的運算友题,值都是只有兩種可能性嗤堰。
位運算是針對于每個位都參與運算。參與運算的數(shù)據(jù)要求是整數(shù)咆爽,由于一個整數(shù)會占用多個 位(8梁棠,16, 32斗埂, 64)符糊,因此,每次位運算都會計算多次呛凶。
例如男娄,兩個 int32 進行位運算, 就需要計算 32 次,每個位都要計算一次模闲。12 & 24 就需要計算 32 次建瘫,假設(shè)兩個數(shù)都是 int32 類型。
支持的運算符:
說明:
-
移位
13>>2尸折,右移 2 位
13<<3啰脚,左移 3 位
-
&^ 位與非
使用整數(shù)(正整數(shù))運算時,將正整數(shù)轉(zhuǎn)為二進制实夹,逐位進行運算橄浓。
代碼演示:
v3 := 13
v4 := 9 fmt.Println(v3 & v4)
//13 00001101
//9 00001001
// &
// = 00001001
fmt.Println(v3 | v4)
// //13 00001101
// //9 00001001
// // |
// // = 00001101
fmt.Println(v3 ^ v4)
//13 00001101
//9 00001001
// ^
// = 00000100 4
fmt.Println(13 >> 2, 13 << 3)
fmt.Println(13 &^ 9)
//13 00001101
//9 00001001
//&^
// = 00000100 4
2) 錯誤級別配置例子
① 說明
通常用于管理一組相關(guān)的開關(guān)狀態(tài)。
開關(guān)狀態(tài)亮航,值得是 0 或 1荸实。
(實操中很常用的例子)例如,需要一個日志系統(tǒng)缴淋,管理日志級別准给,有信息,調(diào)試重抖,警 告露氮,錯誤,致命錯誤仇哆,不推薦沦辙。增加一個系統(tǒng)配置夫植,用于設(shè)置當前系統(tǒng)所使用的日志級別讹剔。 意味著,我們可以選擇記錄信息和錯誤級別的日志详民,或者記錄調(diào)試和不推薦基本的日志延欠。
需要做到:
- 記錄當前啟用的級別
- 判斷某種級別是否啟用
- 開啟某個特定級別(在不影響其他級別的基礎(chǔ)上)
- 關(guān)閉某個特定級別(不影響其他級別)
- 翻轉(zhuǎn)某個級別。
② 記錄配置
本案例中沈跨,就涉及一組開關(guān)狀態(tài)由捎。
適合使用一個整數(shù)的每個位,對應表示某個級別饿凛,使用該整數(shù)記錄整體的配置狞玛,基于位運算 完成業(yè)務邏輯。
設(shè)計如圖:
本例中涧窒,僅僅需要一個整型即可記錄當前的配置狀態(tài)心肪。 利用位運算,完成業(yè)務邏輯:
// 配置項纠吴,當前日志級別
setting := 13 // 00001101
③ 構(gòu)建一組級別數(shù)據(jù)
級別數(shù)據(jù)的特征硬鞍,對應的位為 1,其他位都是 0
可以利用 常量的 iota 來實現(xiàn):
const (
levelInfo = 1 << iota // 00000001 << 0 = 00000001
levelDebug // 1 << iota 00000001 << 1 = 00000010 2
levelWaning // 00000100 4
levelError // 00001000 8
levelFatal // 00010000 16
)
④ 判斷某種基本是否啟用
語法上,就是判斷某個位是否為 1固该。
思路: 構(gòu)建一個只有對應位為 1锅减,其他位為 0 的數(shù)值。例如需要判斷 error 基本是否啟 用伐坏,則構(gòu)建一個 error 對應的位為 1怔匣,其他位為 0 的數(shù)據(jù)。例如:00001000桦沉。
利用該數(shù)據(jù)劫狠,與當前配置值,做位與運算永部,如果結(jié)果為 > 0(error 對應數(shù)據(jù)) 独泞,表示 對應為設(shè)置為 0,結(jié)果為==0 表示苔埋,對應位設(shè)置為 0.
13 00001101 與 00001000 做位與運算懦砂,過程:
00001101 &
00001000
00001000
代碼演示:
// 配置項,當前日志級別 setting := 13 // 00001101
// 判斷 Info 級別是否啟用
fmt.Println(setting & levelInfo > 0) // true
// 判斷 debug 級別是否啟用
fmt.Println(setting & levelDebug > 0) // false
// 判斷 warnig 級別是否啟用
fmt.Println(setting & levelWaning > 0) // true
// 判斷 warning 級別是否啟用
fmt.Println(setting & levelError > 0) // true
// 判斷 fatal 級別是否啟用
fmt.Println(setting & levelFatal > 0) // false
⑤ 開啟某個級別
語法上组橄,將某個為設(shè)置為 1荞膘,不能影響其他位。
某個為之前可能是 1 或 0玉工,最終的結(jié)果都要是 1.
實現(xiàn)思路:位或上羽资,對應位為 1 的值即可。 演示:
// 開啟
// 設(shè)置 debug 級別為開啟
fmt.Println(setting & levelDebug > 0) // false
//setting = setting | levelDebug
setting |= levelDebug
fmt.Println(setting & levelDebug > 0) // true
// 設(shè)置 error 級別為開啟
fmt.Println(setting & levelError > 0) // true
setting |= levelError
fmt.Println(setting & levelError > 0) // true
⑥ 關(guān)閉某個級別
語法上遵班,將某個位設(shè)置為 0屠升。無論原來是什么。
實現(xiàn):與對應的位為 1 的數(shù)據(jù)狭郑,做&^運算即可腹暖。
代碼演示:
// 關(guān)閉
// 關(guān)閉 error 級別
fmt.Println(setting & levelError > 0) // true
setting &^= levelError
fmt.Println(setting & levelError > 0) // false
// 關(guān)閉 fatal 級別
fmt.Println(setting & levelFatal > 0) // false
setting &^= levelFatal
fmt.Println(setting & levelFatal > 0) // false
⑦ 反轉(zhuǎn)狀態(tài)
原來為 1,設(shè)置為 0翰萨,原來為 0 設(shè)置為 1.
實現(xiàn):對某位為 1 的值脏答,進行位異或運算即可。
6.優(yōu)先級別和結(jié)合順序
運算符優(yōu)先級: 當表達式由多個運算符構(gòu)成時亩鬼,計算的順序有先后殖告。
結(jié)合順序: 當級別一致時,選擇從左至右或者反過來雳锋,稱之為結(jié)合順序黄绩。
類似四則混合運算規(guī)律: 從左至右運算,先乘除后加減魄缚,先算括號里邊的宝与。
運算符的優(yōu)先級為焚廊,由上至下,由高到低:
注意:推薦使用括號习劫,干預優(yōu)先級別咆瘟,讓運算順序使用括號變得清晰明了!
7.其他
...
剩余/展開,數(shù)組長度占位
<-
信道寫入讀取
8.表達式和語句
1)表達式
表達式诽里,expression袒餐,可以當做值使用的語法,可以計算得到值的語法谤狡,稱之為表達式灸眼。可以使用表達式為變量賦值墓懂,直接輸出焰宣,作為函數(shù)的返回值,或者參數(shù)進行傳遞都可以捕仔。
典型的表達式:
- 數(shù)據(jù)的字面量匕积, 42 false
- 變量, v
- 表達式參與運算 42 + 1024
- 返回值函數(shù)調(diào)用, len(array)
2)語句
語句, statement榜跌,完成特定功能的語法闪唆,被視作一個獨立的整體,沒有后續(xù)值可用钓葫。例如 if, switch悄蕾。語句不能直接參與表達式運算,需要獨立執(zhí)行础浮。
典型的語句:
- if
- switch
- for
- ++帆调、--