這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Effective Go(官方文檔)筆記
- 自動局部變數提升(編譯期完成?):return &...;
- 內建函數:
- new/make
- copy, append
- delete
- range(這是關鍵字吧?因為後面沒有())
- array是值對象
- slice:引用array
- 2維切片(略)
- map
- if seconds, ok := timezone[tz]; ok { ...
- func (f *File) Read(buf []byte) (n int, err error) { ...
- 注意這裡給*File類型增加了一個Read方法,buf是傳出參數(slice是引用!)
- fmt.Printf("...%d...", 1); //C風格的;
- fmt.Printf(os.stdout, args, ...); //C++風格的?這裡args需要實現io.Writer介面(序列化?)
- %v, %#v
- %T
- type MyString string
- switch t := t.(type){ ... //Go的運行時內省是怎麼實現的?這意味著每一個value/ref都包含了一個type域欄位嗎?
- 變參:v ...interface{} ==> v... (不加...的單獨v可看作slice,可應用range操作)
- func append(slice []T, elements ...T) []T
- append:實際上不能在運行時決定T的類型,需編譯器在編譯時間的支援(所謂的builtin函數)
- defer:延遲到func結束前執行,即使是panic(函數範圍,非block)
- C/C++/Java程式員可以理解為func內部整體包以try{...}finally{...}?
- 枚舉:const { _= iota \n A B C ... }
- 變數組聲明:var { ... }
- 每個檔案中的init():用於驗證初始狀態?
- sort回調:Len() int, Less(i, j int) bool, Swap(i, j int) //這相當於把排序對象當作一個C++裡的RandomAccessIterator介面?
- 類型轉換
- str := value.(string) //如類型不符則runtime error;
- net/http
- type Handler interface {
-
ServHTTP(w ResponseWriter, req *Request)
- => 一旦有了Handler執行個體,向http註冊:http.Handle("/path", handler)
- tie a channel to web page ?
- 為func擴充方法:
- type HandlerFunc func(ResponseWriter, *Request)
- func (f HandlerFunc) ServHTTP(w ..., req ...) { f(w, req) }
- _ = fd //unused, WebKit/Chromium裡經常可以見到這種寫法,未使用的變數顯式標記,未用到的代碼要刪除
- Embedding(type的組合)
- type struct裡可以直接加入其他type的名字,無需變數名字,此時相當於type traits的mixin了?
- Share by communicating
- Goroutines:the stack starts small(可動態調整的棧)——這可能就是Go支援大規模並發程式的原因了
- <-chan:等待完成訊息(自動阻塞)
- * for迴圈變數(設為i)是重用的?=>
- go func(i ...){ ... )(i) //傳遞進閉包,產生新的副本
- i := i //名字的shadowing(這個特性C語言是沒有的,C++的namespace可以認為類似?)
- Channels of channels
- 並行:runtime.GOMAXPROCS(ncpu)
- panic/recover
- recover在unwinding時執行,即defer func() {...}中。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。