Go 語(yǔ)言教程(2)——表達(dá)式

保留關(guān)鍵字

語(yǔ)言設(shè)計(jì)簡(jiǎn)練,只有 25 個(gè)保留關(guān)鍵字刁俭。

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

運(yùn)算符

全部運(yùn)算符橄仍、分隔符、以及其他符號(hào)牍戚。

+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
 &^ &^=

運(yùn)算符結(jié)合率從左到右侮繁。

優(yōu)先級(jí)   運(yùn)算符
------------+---------------------------------------------+----------------------------
high    * / & << >> & &^
        + - | ^
        == != < <= < >=
        <- 
        &&
low     ||

簡(jiǎn)單位運(yùn)算

0110 & 1011 = 0010 AND 都為 1。
0110 | 1011 = 1111 OR ?少?個(gè)為 1如孝。
0110 ^ 1011 = 1101 XOR 只能?個(gè)為 1宪哩。
0110 &^ 1011 = 0100 AND NOT 清除標(biāo)志位

a := 0
a |= 1 << 2 // 0000100: 在 bit2 設(shè)置標(biāo)志位
a |= 1 << 6 // 1000100: 在 bit6 設(shè)置標(biāo)志位
a = a &^ (1 << 6) // 0000100: 清除 bit6 標(biāo)志位

x := 1
^x // 取反運(yùn)算 -0010

初始化

初始化復(fù)合對(duì)象,必須使用類型標(biāo)簽第晰,且左大括號(hào)必須在類型尾部锁孟。

var a = struct{x int}{100}
var b = []int{1, 2, 3}

If

  • 可以省略條件表達(dá)式括號(hào)
  • 支持初始化語(yǔ)句,可以定義代碼塊局部變量
  • 代碼塊左大括號(hào)必須在條件表達(dá)式尾部
x := 0

// 局部變量 n 只能在循環(huán)中使用
if n := "abc"; x > 0 {
    println(n[0])
} else if x < 0 {
    println(n[1])
} else {
    println(n[2])
}

不支持三元操作符 a > b ? a : b

For

For 支持三種循環(huán)方式茁瘦,Go 中沒(méi)有 while 關(guān)鍵字語(yǔ)法品抽,可以用 For 模擬。

s := "abc"

// 常見 For 循環(huán)
// 計(jì)算出長(zhǎng)度 n甜熔,避免多次調(diào)用 len 函數(shù)
for i, n := 0, len(s); i < n; i++ {
    println(s[i])
}

// 替代 while (n > 0) {}
n := len(s)
for n > 0 {
    println(s[n])
    n--
}

// 替代 while (true) {}
for {
    println(s)
}

Range

類似迭代器操作桑包,返回 (索引, 值)或(鍵纺非, 值)

Range 會(huì)復(fù)制對(duì)象哑了,應(yīng)該使用引用類型 slice、map烧颖。

for 循環(huán)的 range 格式可以對(duì) slice 或者 map 進(jìn)行迭代循環(huán)弱左。

遍歷 slice 時(shí),返回當(dāng)前的下標(biāo)和該下標(biāo)對(duì)應(yīng)元素的一個(gè)拷貝炕淮。

s := []int{1, 2, 3, 4, 5}

for i, v := range s { // 復(fù)制 struct slice { pointer, len, cap }
    if i == 0 {
        s = s[:3] // 對(duì) slice 修改拆火,不會(huì)影響 range
        s[2] = 100 // 對(duì)底層數(shù)據(jù)的修改
    }

    println(i, v)
}

輸出:

0 1
1 2
2 100
3 4
4 5

Switch

分支表達(dá)式可以是任意類型,不限于常量涂圆∶蔷担可以省略 break,默認(rèn)自動(dòng)終止润歉。

繼續(xù)下一分支模狭,可以使用 fallthrough,但不再判斷條件踩衩。

x := []int{1, 2, 3}
i := 2

switch i {
    case x[1]:
        println("1")
        fallthrough
    case 1, 3:
        println("2")
    default:
        println("3")
}

輸出
1
2

省略條件表達(dá)式嚼鹉,可以當(dāng) if...else if...else 使用贩汉。

switch {
    case x[1] > 0: // if
        println("1")
    case x[1] < 0: // else if
        println("2")
    default: // else
        println("3")
}

// 帶初始化語(yǔ)句
switch i := x[2]; {
    case x[1] > 0: // if
        println("1")
    case x[1] < 0: // else if
        println("2")
    default: // else
        println("3")
}

Goto、Break锚赤、Continue

?持在函數(shù)內(nèi) goto 跳轉(zhuǎn)匹舞。標(biāo)簽名區(qū)分??寫,未使?標(biāo)簽引發(fā)錯(cuò)誤线脚。

func main() {
    var i int
    for {
        println(i)
        i++
        if i > 2 { goto BREAK }
}
BREAK:
    println("break")
EXIT: // Error: label EXIT defined and not used
}

配合標(biāo)簽赐稽,breakcontinue 可在多級(jí)嵌套循環(huán)中跳出。

func main() {
L1:
    for x := 0; x < 3; x++ {
L2:
        for y := 0; y < 5; y++ {
            if y > 2 { continue L2 }
            if x > 1 { break L1 }

            print(x, ":", y, " ")
        }
        
        println()
    }
}

輸出
0:0 0:1 0:2
1:0 1:1 1:2

break 可?于 for浑侥、switch又憨、select,? continue 僅能?于 for 循環(huán)锭吨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蠢莺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子零如,更是在濱河造成了極大的恐慌躏将,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件考蕾,死亡現(xiàn)場(chǎng)離奇詭異祸憋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肖卧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蚯窥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人塞帐,你說(shuō)我怎么就攤上這事拦赠。” “怎么了葵姥?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵荷鼠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我榔幸,道長(zhǎng)允乐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任削咆,我火速辦了婚禮牍疏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拨齐。我一直安慰自己鳞陨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布奏黑。 她就那樣靜靜地躺著炊邦,像睡著了一般编矾。 火紅的嫁衣襯著肌膚如雪熟史。 梳的紋絲不亂的頭發(fā)上馁害,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蹂匹,去河邊找鬼碘菜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛限寞,可吹牛的內(nèi)容都是我干的忍啸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼履植,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼计雌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起玫霎,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凿滤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后庶近,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翁脆,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鼻种,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了反番。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叉钥,死狀恐怖罢缸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情投队,我是刑警寧澤祖能,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛾洛,受9級(jí)特大地震影響养铸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轧膘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一钞螟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谎碍,春花似錦鳞滨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澡匪。三九已至,卻和暖如春褒链,著一層夾襖步出監(jiān)牢的瞬間唁情,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工甫匹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸鸟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓兵迅,卻偏偏與公主長(zhǎng)得像抢韭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恍箭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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