1.1 Go中流程控制分三大類:條件判斷,循環控制和無條件跳轉
2.1.2 條件判斷語句裏面容許聲明一個變量,這個變量的做用域只能在該條件邏輯塊內
2.1.3 多個條件使用 else if, 與C語言語法同樣
2.2.1 用goto跳轉到必須在當前函數內定義的標籤, 通常不建議使用
2.3.1 Go裏面最強大的一個控制邏輯就是for, 它便可以用來循環讀取數據,又能夠看成while來控制邏輯,還能迭代操做
2.3.2 for expression1; expression2; expression3
2.3.3 有些時候須要進行多個賦值操做,因爲Go裏面沒有,操做符,那麼可使用平行賦值i, j = i+1, j-1
2.3.4 expression1和expression3能夠忽略, 其中;也能夠省略,那麼就變成while的功能了
2.3.5 break操做是跳出當前循環,continue是跳過本次循環
2.3.6 for配合range能夠用於讀取slice和map的數據
2.3.6.1 可使用_變量來接收並丟棄不須要的返回值
2.4.1 有些時候你須要寫不少的if-else來實現一些邏輯處理,這個時候代碼看上去就很醜很冗長, 並且也不易於之後的維護,這個時候switch就能很好的解決這個問題
2.4.2 Go裏面switch默認至關於每一個case最後帶有break
2.4.3 可使用fallthrough強制執行後面的case代碼
3.1.1 func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) { //這裏是處理邏輯代碼 //返回多個值 return value1, value2 }
3.2 官方建議:最好命名返回值,不然會形成生成的文檔可讀性差
3.3 若是命名返回值, 則能夠直接寫成return
3.4.1 func argsSum(args ...int64) (sum int64) { for _, v := range args { sum += v } return }
3.5.1 當咱們傳一個參數值到被調用函數裏面時,其實是傳了這個值的一份copy, 當在被調用函數中修改參數值的時候,調用函數中相應實參不會發生任何變化, 由於數值變化只做用在copy上
3.5.2 咱們須要將x所在地址&x傳入函數,並將函數的參數的類型由int改成*int,即改成指針類型, 才能在函數中修改x變量的值。此時參數仍然是按copy傳遞的,只是copy的是一個指針
3.6.1 當函數執行到最後時,這些defer語句會按照逆序執行,最後該函數返回
3.7.1 函數也是一種變量,咱們能夠經過type來定義它
3.7.2 它的類型就是全部擁有相同的參數,相同的返回值的一種類型
3.7.3 既是函數模板的角色,也能夠做爲值傳遞,如函數實參
3.8.1 go中能夠拋出一個panic的異常,而後在defer中經過recover捕獲這個異常,而後正常處理
3.8.3 若是不用recover捕獲panic異常,會致使整個進程出錯中斷
3.8.4 go省略了try, panic至關於trow拋出異常, recover至關於catch捕獲異常, 可是go限制只能在defer即finally中捕獲異常 並且go的defer是動態向上反向隊列方式傳遞的, 即finally鏈式反向執行
3.8.5 panic拋出異常, 中止當前執行點, 一直往上層拋出異常, 直到程序crash, 或者被defer捕獲阻止崩潰,而後繼續下一個defer
3.9.2 error與異常處理的最佳實踐參考官方博客或者其餘github項目
3.9.3.1 老是檢查error,並處理error
3.9.3.2.1 https://github.com/golang/go/blob/master/src/net/http/client.go
3.9.4.1.1 http://reusee.github.io/post/error-handling/
3.9.4.2.1 https://github.com/reusee/codes/blob/master/err/err.go
3.9.4.2.2 https://github.com/golang/go/blob/master/src/encoding/gob/error.go
3.10.1 Go程序會自動調用init()和main()
3.10.2 每一個package中的init函數都是可選的,但package main就必須包含一個main函數
3.11.1 導入的是文件夾名稱,而後自動掃面package,引用的時候使用package
3.11.2.1 import( f "fmt")