保留關(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)簽赐稽,break
和 continue
可在多級(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)锭吨。