1. 程式人生 > 其它 >Go xmas2020 全英課程 06 學習筆記、Control Statements、Declarations & Types

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 是基於樹形結構的,它又一個隱含的順序,按字母順序排列。

gomap 是無序的,基於雜湊表。不同時間迭代對映會得到不同的順序。如果你需要順序取出,那你要先取出 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 沒有