聲明變量的一般形式是使用 var 關鍵字:
var identifier type
可以一次聲明多個變量:
var identifier1 identifier2 type
Go 語言中有多種靈活的方式可以進行變量的聲明和賦值:
- 指定變量類型,如果沒有初始化,則變量默認爲零值;
- 根據值,自行判斷變量類型;
- 使用 := 聲明語句,可以省略 var 關鍵字。
演示1 聲明變量而不初始化
package main
import "fmt"
func main() {
var a string = "Hello Goland!" // 聲明一個變量,並初始化
fmt.Println(a)
var b int // 沒有初始化即爲零值
fmt.Println(b)
var c bool // bool 零值爲 false
fmt.Println(c)
/*零值說明:
數值類型(包括complex64/128)爲 0
布爾類型爲 false
字符串爲 ""(空字符串)
*/
var a2 *int
var a3 []int
var a4 map[string]int
var a5 chan int
var a6 func(string) int
var a7 error // error 爲藉口
fmt.Println(a2, a3, a4, a5, a6, a7)
}
運行結果:
演示2 Go編譯器會根據值,自行判斷變量類型
package main
import "fmt"
func main() {
var b = true
fmt.Println(b)
}
演示3 := 是一個聲明語句,使用 := 時不能與 var 關鍵字同時出現
package main
import "fmt"
func main() {
b := true
fmt.Println(b)
}
演示4 多變量聲明
package main
import "fmt"
var x, y int
//var()的形式用於聲明全局變量,不能出現在函數體中
var (
a int
b bool
)
var c, d int = 1, 2
var e, f = 123, "Hello Golang" // 和 python 很像,不需要顯示聲明類型,自動推斷
//:=聲明格式只能在函數體中出現
//g, h := 123, "Hello Golang"
func main() {
g, h := 123, "Hello Golang"
fmt.Println(x, y, a, b, c, d, e, f, g, h)
}
運行結果:
小結和注意事項:
- 值類型:所有像 int、float、bool 和 string 這些基本類型都屬於值類型,使用這些類型的變量直接指向存在內存中的值;當使用等號
=
將一個變量的值賦值給另一個變量時,如:j = i,實際上是在內存中將 i 的值進行了拷貝。 - 引用類型:複雜的數據一般使用引用類型保存。一個引用類型的變量 r1 存儲的是 r1 的值所在的內存地址,或內存地址中第一個字所在的位置。這個內存地址爲稱之爲指針,這個指針實際上也被存在另外的某一個字中。同一個引用類型的指針指向的多個字可以是在連續的內存地址中(內存佈局是連續的),這也是計算效率最高的一種存儲形式;也可以將這些字分散存放在內存中,每個字都指示了下一個字所在的內存地址。當使用賦值語句 r2 = r1 時,只有引用(地址)被複制。如果 r1 的值被改變了,那麼這個值的所有引用都會指向被修改後的內容,在這個例子中,r2 也會受到影響。
- 使用操作符 := 可以高效地創建一個新的變量,這是使用變量的首選形式,但是它只能被用在函數體內,而不可以用於全局變量的聲明與賦值。
- 局部變量聲明後必須在代碼中使用它,否則會編譯報錯;全局變量允許聲明但不使用。
- 使用 a, b = b, a,可以交換變量的值,a和b的類型必須一致。
-
標識符 _ 也被用於拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。_ 實際上是一個只寫變量,你不能得到它的值。這樣做是因爲 Go 語言中你必須使用所有被聲明的變量,但有時你並不需要使用從一個函數得到的所有返回值。