Go xmas2020 全英課程 06 學習筆記、Control Statements、Declarations & Types
課程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com)
主講老師 Matt Holiday
06-Control Statements
If-then-else
- 花括號是必須寫的,而且有嚴格的格式
- if 語句內可以寫短宣告
Loop
for
range array
注意第二種方式 v 是被拷貝的,假設 myArray
是個 4K 大小的陣列,那麼每次迴圈時都會進行復制,這種情況下最好採用第一種方式。第一種更加高效,只用索引的方式直接從陣列中獲取避免了複製。
range map
這兩種情況下,迴圈都會進行很長的時間。
在 c++
中 map
是基於樹形結構的,它又一個隱含的順序,按字母順序排列。
在 go
中 map
是無序的,基於雜湊表。不同時間迭代對映會得到不同的順序。如果你需要順序取出,那你要先取出 keys
然後對其按字母進行排列,再遍歷從maps
取出值。
infinite loop
common mistake
labels and loops
例子中可能 returnedData
切片很長,所以匹配到第一個之後應該返回到標籤 outer
的外部迴圈。
需要明確指出 continue outer
,即對應 outer
標籤
Switch
switch
-
switch
其實就是 if else 的語法糖。更容易理解,提高可讀性。 - 可以在
switch
後短宣告。 - 可以為一個
case
新增空的語句段,只判斷不執行。 - 不需要新增
break
。 - 最好新增
default
。
switch on true
cases
可以有邏輯語句,就像一堆 if else,更加方便。
Packages
所有 go
檔案必須以 package
開頭。
短宣告只能在函式中使用,因為在包中應該以關鍵詞開頭,這樣方便編譯器解析。
如果首字母大寫,那麼就是匯出的,否則是私有的。
包依賴應該是一個樹形結構,不能迴圈依賴。
包內的東西將在 main
函式前被初始化,在執行時將會執行包內的 init
函式(在main呼叫前)。
迴圈依賴會導致不知道優先初始化哪個的問題。
好的包在一個簡單的 api 後面封裝了深層複雜的功能
06-Declarations & Types
Declaration
Short declarations
重點講一下第三條
- 第一行用短聲明瞭
err
變數 - 第二行重複宣告
err
會報錯 - 第三行會正確執行,因為聲明瞭新變數
x
,而err
只是重新賦值
Structural typing
duck typing
在程式設計中,鴨子型別(英語:duck typing)是動態型別的一種風格。在這種風格中,一個物件有效的語義,不是由繼承自特定的類或實現特定的介面,而是由"當前方法和屬性的集合"決定。
“當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。”
在鴨子型別中,關注點在於物件的行為,能作什麼;而不是關注物件所屬的型別。例如,在不使用鴨子型別的語言中,我們可以編寫一個函式,它接受一個型別為"鴨子"的物件,並呼叫它的"走"和"叫"方法。在使用鴨子型別的語言中,這樣的一個函式可以接受一個任意型別的物件,並呼叫它的"走"和"叫"方法。如果這些需要被呼叫的方法不存在,那麼將引發一個執行時錯誤。任何擁有這樣的正確的"走"和"叫"方法的物件都可被函式接受的這種行為引出了以上表述,這種決定型別的方式因此得名。
Operator
邏輯運算子只能給布林值用,其他程式語言可能有 0 == false,但是 go 沒有