Introduction: 新語言, 新思維 Formatting Indentation: 預設tab Line Length: 無限制, 會自動換行 Parentheses: 圓括弧, 無限制, 但會自動去掉if, switch, for控制結構中的圓括弧. 使用gofmt命令自動格式源碼. C... ...
Introduction:
新語言, 新思維
Formatting
Indentation: 預設tab
Line Length: 無限制, 會自動換行
Parentheses: 圓括弧, 無限制, 但會自動去掉if, switch, for控制結構中的圓括弧.
使用gofmt命令自動格式源碼.
Commentary
多行: /**/
單行: //
使用godoc命令自動導出註釋. 文檔註釋指緊鄰API的註釋, 如果遇到空行則會中止.
Names:
package names
interface names: 一般以-er或-able結尾
MixedCaps:
即Java中的駝峰式
GO中的identifier由字線,數字,下劃線_組成, 並且開頭不能是數字. 可分3種:
* exported identifier: 大寫開頭
* package identifier: 小寫或下劃線_開頭
* blank identifier: 下劃線_
Semicolons:
GO自動在行尾插入semicolon, 如果最後token是:
* identifier
* literal
* one of break continue, fallthrough return ++ -- ) ] }
根據解析規則, 控制結構的塊開始標記{ 另起一行.
Control structures
if-else: 與傳統C語言相同
redeclaration and reassignment: 使用short declaration必須保證at least one other variable is anew. 至少一個新變數
for: 有4種形式,
* for{...}, 死迴圈
* for condition {...}, 條件迴圈
* for init; condition; post {...}, 帶初始條件後置迴圈, 其中init部分只能使用短聲明定義新變數.
* for x := range xxx{...}, range迴圈
switch: 有2種形式,
* switch {...}, 非匹配選擇
* switch expression {...}, 是匹配選擇
select: 有1種形式,
* select {}, 非匹配選擇
Type switch:
Go的類型檢測與轉換有type-assertion與type-switch. type-switch指x.(type)必須結合switch expression{}使用. 否則報錯! 另一種替換用法是relect.TypeOf()
Funtions:
Multiple return values: 多值返回
Named result parameters: 命令返回參數
註意: Go中的method都是function(receiver, params...)形式. 但反之則不是. 另外, 只有本地類型才能定義method. cannot define new methods on non-local type. 所謂local type指在相同package path.
Defer:
defer, panic(), recover()配合使用.
理解Go的function機制, 需要明白defer stack, panic error, return value.
function無論正常結束或panic結束,都保證執行defer stack中的函數.
function如果正常結束或recover恢復panic error, 則會return value. 否則拋出panic error.
function執行defer stack時, 新的panic error會覆蓋舊的panic error.
總結而言, function是Go基本的執行處理單元.
Data:
Allocation with new or make: 理解Go的new()與make()用法, 需要明白GO的數據類型知識.
* 根據功能劃分:
基本類型: bool, int/uint/unitptr, float, complex, byte/rune/string, struct, array
指針類型: slice, map, chan, func, pointer,
介面類型: interface, error
當然nil類型也可以有pointer形式, 但不是GO的idiomatic. 介面類型是一種特殊的類型, 由<type,value>複合而成. 因為當且僅當<nil, nil>才是nil, 所以nil interface不一定等於nil.
* 根據零值(zero-value)劃分:
基本類型的零值都是non-nil
指針類型與介面類型的零值都是nil. 其實說介面類型的零值是nil不大恰當,因為interface是由<type,value>組成, 如果type為基本類型,則value的零值就不會是nil了. 指針類型與介面類型也有指針形式, 這相當於C中指針的指針, 通過間接指針來訪問數據不會是個理想的做法.
所以, 你不會用new()來創建指針類型的指針, 因為其零值是nil, 創建一個指向nil的間接指針有什麼意義哦? 也不能用make()來創建基本類型的值,因為其擁有零值了.再初始化就無價值了. 至於介面類型比較奇葩, 其底層是<type,value>,且僅當<nil,nil>時才等於nil. 否則要用 x == nil || reflect.ValueOf(x).IsNil()來判斷是否為nil.
Printing:
Go中print有2種選擇, 一是builtin的print(), println()函數. 一是fmt package. 據說後者帶有緩衝, 性能更優.
Builtin:
GO中builtin函數:
append(), copy(), delete()
len(), cap(), close()
new(), make()
complex(), real(), imag()
print(), println()
panic(), recover()
import, type, const, var block:
Go中可以將多條import, type, const, var組合為block.
在const block中使用iota表示line index(從0開始)
關於var, const的沒有聲明或定義:
變數的類型向後追溯, 直到第一個類型.
常量的定義向前追溯, 直到第一個定義.
init function:
每個go package(或者說go file)可以定義零個或多個init()函數. 在import package時會被執行, 但共執行順序無保證. 註意: 每次import package都會執行init函數, 而不僅僅初次導入執行. 這與Java中的<clinit>方法不同.
Pointers vs Values:
對於類型T, T的method是receiver為T的method. *T的method是receiver為T或*T的method. 簡單地說, T的method屬於*T, 但反之不成立.
順便記憶: cannot define new methods on non-local type.
Interface and methods:
interface是method的集合. struct是data的集合.
interface類型轉換使用type-assertion與type-switch.
Import語法:
import [name] "path"
* name可以是空(預設), 點(當前), 下劃線(無), 標識符(自定義)
* path可以是絕對路徑(相對$GOPATH), 相對路徑(相對當前go file). 註意: 結合vendor機制不能使用相對路徑, 否則解析會出錯.
Embedding:
interface, struct使用組合方式實現代碼復用, 此區別與C++, Java等的繼承.
Goroutine
go-chan
註意: channel 有三種: 讀寫chan, 只讀chan, 只寫chan. 後二者一般是作為形參. 因為一個channel只能讀或寫都是沒有意義的.
使用select結合time.After()等可以實現定時阻塞.
Web server:
http.Handle()
http.ListenAndServe()