三. Go語言變量

聲明變量的一般形式是使用 var 關鍵字:

var identifier type

可以一次聲明多個變量:

var identifier1 identifier2 type

Go 語言中有多種靈活的方式可以進行變量的聲明和賦值:

  1. 指定變量類型,如果沒有初始化,則變量默認爲零值;
  2. 根據值,自行判斷變量類型;
  3. 使用 := 聲明語句,可以省略 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 語言中你必須使用所有被聲明的變量,但有時你並不需要使用從一個函數得到的所有返回值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章