Go基礎(chǔ)-008 運算符

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
  • ++帆调、--
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霸旗,隨后出現(xiàn)的幾起案子贷帮,更是在濱河造成了極大的恐慌戚揭,老刑警劉巖诱告,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異民晒,居然都是意外死亡精居,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門潜必,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靴姿,“玉大人,你說我怎么就攤上這事磁滚》鹣牛” “怎么了宵晚?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長维雇。 經(jīng)常有香客問我淤刃,道長,這世上最難降的妖魔是什么吱型? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任逸贾,我火速辦了婚禮,結(jié)果婚禮上津滞,老公的妹妹穿的比我還像新娘铝侵。我一直安慰自己,他們只是感情好触徐,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布咪鲜。 她就那樣靜靜地躺著,像睡著了一般撞鹉。 火紅的嫁衣襯著肌膚如雪嗜诀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天孔祸,我揣著相機與錄音隆敢,去河邊找鬼。 笑死崔慧,一個胖子當著我的面吹牛拂蝎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惶室,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼温自,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皇钞?” 一聲冷哼從身側(cè)響起悼泌,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夹界,沒想到半個月后馆里,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡可柿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年鸠踪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片复斥。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡营密,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出目锭,到底是詐尸還是另有隱情评汰,我是刑警寧澤纷捞,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站被去,受9級特大地震影響兰绣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜编振,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一缀辩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踪央,春花似錦臀玄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至液斜,卻和暖如春累贤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背少漆。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工臼膏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人示损。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓渗磅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親检访。 傳聞我的和親對象是個殘疾皇子始鱼,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量医清、變量、屬性卖氨、下標構(gòu)造器協(xié)議擴展泛型類型別名位運算...
    寒橋閱讀 877評論 0 2
  • 運算符是處理數(shù)據(jù)的基本方法会烙,用來從現(xiàn)有的值得到新的值。JavaScript 提供了多種運算符双泪,本章逐一介紹這些運算...
    徵羽kid閱讀 667評論 0 0
  • 算術(shù)運算符 JavaScript 共提供10個算術(shù)運算符持搜,用來完成基本的算術(shù)運算。 加法運算符:x + y 減法運...
    guyigg閱讀 1,165評論 0 1
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,370評論 0 5
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,783評論 1 10