Go基礎(chǔ)系列:5. 常量及運算符

學(xué)到什么

  1. 什么是常量瘩绒?
  2. 如何定義常量辕棚?
  3. 常量和變量有什么不同欲主?
  4. 如何使用常量?
  5. 有哪些運算符逝嚎?
  6. 如何使用運算符?
  7. 運算符的優(yōu)先級详恼?

常量

1. 概念

常量的值在程序運行期間是不能改變的补君,而變量的值在運行期間是可以改變的。

舉個實際使用到常量的幾個場景:

  • web開發(fā)時昧互,根據(jù)業(yè)務(wù)定義的錯誤碼
  • 程序的發(fā)行版本號
  • 數(shù)據(jù)庫連接池數(shù)量(如果不通過配置文件時)
  • 等等

在使用時挽铁,只要你確定在程序運行期間不改變它的值,就可以使用常量敞掘。

2. 定義

常量的定義格式: const 常量名 [常量類型] = 常量值

[常量類型] 可以省略叽掘,編譯器會根據(jù)值來推導(dǎo)類型。

// 顯示定義
const b string = "abc"

// 隱式定義
const b = "abc"

對于常量值的數(shù)據(jù)類型玖雁,只可以定義為布爾型更扁、數(shù)字型(整數(shù)型、浮點型和復(fù)數(shù))和字符串型。

// 默認(rèn) bool
const isOpen = true

// 默認(rèn) rune浓镜,int32 的別名
const MyRune = 'r'

// 默認(rèn) int
const occupancyLimit = 12

// 默認(rèn) float64
const vatRate = 29.87

// 默認(rèn) complex128
const complexNumber = 1 + 2i

// 默認(rèn) string
const hotelName = "Gopher Hotel"

定義時還有兩種寫法溃列。

// 第一種,常量塊的形式
const (
    isOpen = true
    MyRune = 'r'
)

// 第二種膛薛,并行賦值
const limit, rate = 12, 29.8

注:第一種“常量塊”的形式是實際中用的比較多的听隐。

3. 隱式定義不限制

是什么意思呢?意思就是我在定義時哄啄,省略了數(shù)據(jù)類型后雅任,值的大小是不受限制,即不會產(chǎn)生溢出咨跌。

const num = 111111111111111111111111111111111111111111111

如果顯示定義數(shù)字型常量沪么,它必然會有存儲空間大小限制。比如:定義一個int64 類型虑润,它的最大值為 9223372036854775807成玫,但如果超過這個最大值,就會溢出拳喻,程序自然會拋異常哭当,還原如下:

// 文件名 main.go
package main

import "fmt"

func main() {
    // 最大值 + 1
    const num int64 = 9223372036854775808
}

運行后輸出以下結(jié)果:

go run main.go
## 輸出
.\main.go:6:8: constant 9223372036854775808 overflows int64

4. iota 用法

iota是 Go 語言中的一個關(guān)鍵字,先看代碼冗澈,再解釋钦勘。

const (
    a = iota  // a = 0
    b         // b = 1
    c         // c = 2
    d = 5     // d = 5   
    e         // e = 5
)

iota 從0開始,每增加新的一行就會自動加一亚亲,直到重新聲明一個 constiota 重置為0彻采,遇到新的賦值時 iota 將不再應(yīng)用。

再說說一個 const塊 中出現(xiàn)多個 iota 關(guān)鍵字時是什么情況捌归。

const (
    a = iota  // a = 0
    b         // b = 1
    c         // c = 2
    d = 5     // d = 5   
    e = iota  // e = 4
)

當(dāng) d 常量賦值為 5 時肛响,iota 只是暫時不應(yīng)用,直到再次使用惜索,而 iota 繼續(xù)保持在增加新的一行時自增一特笋。

iota 也可以參加運算,舉幾個例子就明白了巾兆。

// 從1開始自動加一
const (
    Apple = iota + 1 // Apple=1 
    Cherimoya        // Cherimoya=2 
    Elderberry       // Elderberry=3
)

// 并行賦值兩個常量猎物,iota 只會在第一行增長一次
// 而不會因為使用了兩次就增長兩次
const (
    Apple, Banana = iota + 1, iota + 2 // Apple=1 Banana=2
    Cherimoya, Durian   // Cherimoya=2 Durian=3
    Elderberry, Fig     // Elderberry=3, Fig=4

)

// iota參與位運算
const (
    Open = 1 << iota  // 0001
    Close             // 0010
    Pending           // 0100
)

運算符

1. 分類

  • 算術(shù)運算符:+(加),-(減)角塑,*(乘)蔫磨,/(除),%(求余)圃伶,++(自增)堤如,--(自減)
  • 比較運算符:==(等于)蒲列,!=(不等于),>(大于)煤惩,<(小于), >=(大于等于), <=(小于等于)
  • 賦值運算符:=(右值賦值給左側(cè))嫉嘀, += , -=魄揉, *=剪侮, /=,%=, &=, |=, ^=, >>=, <<= (前面的都是左側(cè)值和右側(cè)值運算后再賦值給左側(cè))
  • 位運算符: ****&(按位與)洛退,|(按位或)瓣俯,^(按位異或/取反),>>(右移位)兵怯,<<(左移位)
  • 邏輯運算符:&&(與)彩匕,||(或),C角(非)
  • 其他運算符:&(取變量地址)驼仪,*(指針)

2. 算數(shù)運算符

初始化 a 和 b 兩個變量進行運算,使用如下:

a := 10
b := 3

fmt.Println("a+b=", a+b)  // a+b= 13
fmt.Println("a-b=", a-b)  // a-b= 7
fmt.Println("a*b=", a*b)  // a*b= 30
fmt.Println("a/b=", a/b)  // a/b= 3

// 不支持 ++a
a++
fmt.Println("a++=", a)  // a++= 11
// 錯誤寫法:fmt.Println(a++),
// 必須經(jīng)過運算后才可使用, 自減也是一樣

// 不支持 --a
a--
fmt.Println("a--=", a)  // a--= 10

注:自增和自減去只支持后置的++或--袜漩。

3. 比較運算符

初始化 a 和 b 兩個變量绪爸,進行比較,使用如下:

a := 10
b := 3

fmt.Println("a==b:", a == b)  // a==b: false
fmt.Println("a!=b:", a != b)  // a!=b: true
fmt.Println("a>b:", a > b)    // a>b: true
fmt.Println("a>=b:", a >= b)  // a>=b: true
fmt.Println("a<b:", a < b)    // a<b: false
fmt.Println("a<=b:", a <= b)  // a<=b: false

4. 賦值運算符

初始化 a 變量 為10宙攻,使用如下:

// 將 10 賦值給 a 變量
var a = 10  // 簡寫方式: a := 10

// 在10的基礎(chǔ)上加2
// 等價于 a = a + 2
a += 2  // 12

// 在12的基礎(chǔ)上減3
// 等價于 a = a - 3
a -= 3  // 9

// 在9的基礎(chǔ)上乘以2
// 等價于 a = a * 2
a *= 2  // 18

// 在18的基礎(chǔ)上除以3
// 等價于 a = a / 3
a /= 3  // 6

// 在6的基礎(chǔ)上對4求余
// 等價于 a = a % 4
a %= 4  // 2

注:&=奠货、|=、^=座掘、>>=递惋、<<= 運算符就省略不寫了(不是懶,感覺太啰嗦了)溢陪,看懂下面的位運算符的意思萍虽,照上面的類比理解就明白了。

5. 位運算符

初始化 a 和 b 兩個變量進行運算形真,前提要明白十進制如何轉(zhuǎn)化為二進制贩挣,使用如下:

a := 4  // 二進制: 0100
b := 3  // 二進制: 0011

// 按位與
// 對應(yīng)位都為1時,結(jié)果為1
a & b  // 0

// 按位或
// 對應(yīng)位有一個為1時没酣,結(jié)果為1
a | b  // 7

// 按位異或
// 對應(yīng)位相同時為0,不相同時為1
a ^ b  // 7

// 按位取反
// 取反后變成1100, 最高位1代表負(fù)數(shù)
^b  // -4

// 按位右移
// 將二進制 0100 向右移動一位變成 0010
a >> 1  // 2

// 按位左移
// 將二進制 0100 向左移動一位變成 1000
a << 1  // 8

注:”按位異或“和”按位取反“的運算符是一樣的卵迂,區(qū)別在于操作數(shù)數(shù)量上裕便,”按位異或“操作數(shù)為兩個,”按位取反“操作數(shù)是一個见咒。

6. 邏輯運算符

邏輯運算符只能應(yīng)用到 bool 類型上偿衰,初始化 a 和 b 兩個 bool 值,使用如下:

a := true
b := false

// 與運算,都為 true 時下翎,結(jié)果為 true
a && b  // false

// 或運算缤言,有一個為 true 時,結(jié)果為 true
a || b // true

// 非運算视事,為 true 時胆萧,結(jié)果為 false
// 反之,為 false 時俐东,結(jié)果為true
!a  // false
!b  // true

7. 其他運算符

就剩下兩個運算符的使用了跌穗,往下看:

// 變量地址
a := 1
fmt.Println(&a) // 0xc00000a9b0

// 指針變量,在變量地址前加個 * 代表取出值
p := &a
fmt.Println(*p)  // 1

8. 運算符優(yōu)先級

優(yōu)先級:表中”優(yōu)先級“列數(shù)字越大優(yōu)先級越高,規(guī)定了不同優(yōu)先級的結(jié)合順序虏辫,舉例如下:

// '*' 優(yōu)先級 > '+' 優(yōu)先級
// 等價于 a := (2 * 3) + 1
a := 2 * 3 + 1

結(jié)合性:表中“結(jié)合性”列中的“從左到右”和“從右到左”表示同優(yōu)先級運算符的結(jié)合順序蚌吸,舉例如下

// 從表中看到結(jié)合性是從左到右
// 等價于 a := (1 + 2) + 3 
a := 1 + 2 +3

總結(jié)

本篇講解了“常量”和“運算符”的使用,如果掌握了其它編程語言砌庄,那重點看看常量怎么使用就行羹唠,尤其是 iota 關(guān)鍵字的使用,至于“運算符”語言之間都差不多娄昆,就可以偷懶不看了佩微,有啥不懂的就在下方留言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稿黄,一起剝皮案震驚了整個濱河市喊衫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杆怕,老刑警劉巖族购,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陵珍,居然都是意外死亡寝杖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門互纯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑟幕,“玉大人,你說我怎么就攤上這事留潦≈豁铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵兔院,是天一觀的道長殖卑。 經(jīng)常有香客問我,道長坊萝,這世上最難降的妖魔是什么孵稽? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任许起,我火速辦了婚禮,結(jié)果婚禮上菩鲜,老公的妹妹穿的比我還像新娘园细。我一直安慰自己,他們只是感情好接校,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布猛频。 她就那樣靜靜地躺著,像睡著了一般馅笙。 火紅的嫁衣襯著肌膚如雪伦乔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天董习,我揣著相機與錄音烈和,去河邊找鬼。 笑死皿淋,一個胖子當(dāng)著我的面吹牛招刹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窝趣,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼疯暑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哑舒?” 一聲冷哼從身側(cè)響起妇拯,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洗鸵,沒想到半個月后越锈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡膘滨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年甘凭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片火邓。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡丹弱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铲咨,到底是詐尸還是另有隱情躲胳,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布纤勒,位于F島的核電站泛鸟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏踊东。R本人自食惡果不足惜北滥,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闸翅。 院中可真熱鬧再芋,春花似錦、人聲如沸坚冀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧飞。三九已至,卻和暖如春独郎,著一層夾襖步出監(jiān)牢的瞬間液南,已是汗流浹背壳猜。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滑凉,地道東北人统扳。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像畅姊,于是被迫代替她去往敵國和親咒钟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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