同其它語言一樣,Go也有順序,分支,迴圈三大程式結構,只不過它更精煉。
順序
- if 條件判斷(許初始化變數)
- 條件判斷語句裡面允許宣告一個變數,該變數的作用域只能在該條件邏輯塊內
-
goto 無條件跳轉
- 用goto 跳轉到必須在當前函式內定義的標籤
-
標籤名是大小寫敏感的。
func myFunc() { i := 0 Here: // 這行的第一個詞,以冒號結束作為標籤 println(i) i++ goto Here // 跳轉到 Here 去 }
迴圈
- for
- 迴圈讀取資料,可作while控制邏輯(注意 golang中無while語句)
sum := 1 for sum < 1000 { sum += sum }
- 迭代操作
- for 配合 range 可以用於讀取 slice 和 map 的資料
- break 和 continue 還可以跟著標號,用來跳到多重迴圈中的外層迴圈
- 標號語句必須緊接在迴圈的頭部。標號語句不能用在非迴圈語句的前面。
- 迴圈讀取資料,可作while控制邏輯(注意 golang中無while語句)
分支
-
switch
- 表示式不必是常量或整數
- 執行的過程從上至下,直到找到匹配項
- 如果 switch 沒有表示式,它會匹配 true。
-
switch 預設相當於每個 case 最後帶有 break,匹配成功跳出整個switch,可以使用 fallthrough 強制執行後面的 case 程式碼。
i := 10 switch i { case 1: fmt.Println("i is equal to 1") case 2, 3, 4: fmt.Println("i is equal to 2, 3 or 4") case 10: fmt.Println("i is equal to 10") fallthrough default: fmt.Println("All I know is that i is an integer") }
函式
-
特點
- 支援多值返回,命名返回值,必須宣告型別
- 函式可以有一個或者多個引數,每個引數後面帶有型別,透過,分隔
-
可命名返回引數的變數,若函式是匯出建議命名返回值
func SumAndProduct(A, B int) (add int, Multiplied int) { add = A+B Multiplied = A*B return } // 支援變參 func myfunc(arg ...int) {} type testInt func(int) bool // 宣告瞭一個函式型別
-
傳值 vs 傳指標
- 傳參實際上是傳值,其值可以是變數的值,也是可以是變數的地址,即指標
- 變數在記憶體中是存放於一定地址上的,修改變數實際是修改變數地址處的記憶體
- 傳指標使得多個函式能操作同一個物件。
- 傳指標比較輕量級 (8bytes),只是傳記憶體地址,指標傳遞體積大的結構體
- 若用引數值傳遞的話, 在每次 copy 上面就會花費相對較多的系統開銷(記憶體和時間)
- Go 語言中 channel,slice,map這三種型別的實現機制類似指標,所以可以直接傳遞,而不用取地址後傳遞指標
關鍵字
- defer規則
- 多個defer呼叫 defer,那麼 defer 是採用後進先出模式
- defer 後指定的函式會在函式退出前呼叫
- 當函式執行到最後時,這些 defer 語句會按照逆序執行,最後該函式返回。
- 函式可作為值型別,常用在寫通用介面
- panic Recover
- main init
- init 函式 能夠應用於所有的 package,可選
- main 函式(只能應用於 package main,必選)
- 這兩個函式在定義時不能有任何的引數和返回值。
- 程式的初始化和執行都起始於 main 包
- 流程
- main匯入包
- 對匯入包內的常量和變數進行初始化
- 執行匯入包內的init函式
- 對main包中的包級常量和變數進行初始化,執行main包init,main函式
- 關鍵字列表
- defer 用於類似解構函式
- go 用於併發
- select 用於選擇不同型別的通訊
- interface 用於定義介面
- struct 用於定義抽象資料型別
- chan 用於 channel 通訊
- type 用於宣告自定義型別
- map 用於宣告 map 型別資料
- range 用於讀取 slice、map、channel 資料
import
- GOROOT 環境變數指定目錄下去載入該模組
// 當前檔案同一目錄的 model 目錄,但是不建議這種方式來 import import "./model" // 絕對路徑 載入 gopath/src/shorturl/model 模組 import "shorturl/model"
-
import 簡化行為 - 點 省略字首的包名 - 別名 - _ 呼叫包裡面的 init 函式
import ( // 即呼叫 fmt.Println("hello world") 可以省略的寫成 Println("hello world") . "fmt" ) import( // 即可 f.Println("hello world") f "fmt" ) import ( "database/sql" // 呼叫了該包內的init函式,但不對其它內容進行匯入處理 _ "github.com/ziutek/mymysql/godrv" )
本作品採用《CC 協議》,轉載必須註明作者和本文連結