這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1.變數
1.1 聲明變數
使用var關鍵字可以建立一個指定類型的變數:
var i int = 0var i = 0var i int
以上三個運算式均是合法的,第三個運算式會將i初始化為int類型的零值,0;如果i是bool類型,則為false;i是float64類型,則為0.0;i為string類型,則為"";i為interface類型,則為nil;i為參考型別,則為nil;如果i是struct,則是將struct中所有的欄位初始化為對應類型的零值。
可以在同一條語句中聲明多個變數:
var i, j, k int // int, int, intvar b, f, s = true, 2.3, "four" // bool, float64, string
包內可見的變數在main函數開始執行之前初始化,本地變數在函數執行到對應的聲明語句時初始化。
變數也可以通過函數的傳回值來初始化:
var f, err = os.Open(name) // os.Open returns a file and an error
1.2 短聲明
在函數內部,有一種短聲明的方式,形式是name := expression,這裡,變數的類型是由編譯器自動確定的。
anim := gif.GIF{LoopCount: nframes}freq := rand.Float64() * 3.0t := 0.0
因為這種形式非常簡潔,因此在函數內部(本地變數)大量使用。如果需要為本地變數顯式的指定類型,或者先聲明一個變數後面再賦值,那麼應該使用var:
1 i := 100 // an int2 var boiling float64 = 100 // a float643 var names []string4 var err error5 var p Point
就像var聲明一樣,短聲明也可以並行初始化
i, j := 0, 1
要謹記的是,:=是一個聲明,=是一個賦值,因此在需要賦值的場所不能使用 :=
1 var i int 2 i := 10//panic : no new variables on left side of :=
可以利用並行賦值的特性來進行值交換:
1 i, j = j, i // swap values of i and j
有一點需要注意的:短聲明左邊的變數未必都是新聲明的!
1 in, err := os.Open(path1) //新聲明兩個變數:in, err 2 //... 3 out, err := os.Create(path2) 4 /*因為err已經聲明過,因此這裡只新聲明一個變數out。 5 雖然這裡使用:=,但是err是在上個語句聲明的,這裡僅僅是賦值*/
而且,短聲明的左邊變數必須有一個是新的,若都是之前聲明過的,會報編譯錯誤:
1 f, err := os.Open(infile) 2 // ... 3 f, err := os.Create(outfile) // compile error: no new variables
正確的寫法是這樣的:
1 f, err := os.Open(infile) 2 // ... 3 f, err = os.Create(outfile) // compile ok
1.3 指標
- f, err := os.Open(infile)
- // ...
- f, err = os.Create(outfile) // compile ok