天天看點

Go 語言變量

變量來源于數學,是計算機語言中能儲存計算結果或能表示值抽象概念。

變量可以通過變量名通路。

Go 語言變量名由字母、數字、下劃線組成,其中首個字元不能為數字。

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

可以一次聲明多個變量:

package main

import "fmt"

func main() {

    var a string = "Runoob"

    fmt.Println(a)

    var b, c int = 1, 2

    fmt.Println(b, c)

}

以上執行個體輸出結果為:

第一種,指定變量類型,如果沒有初始化,則變量預設為零值。

零值就是變量沒有做初始化時系統預設設定的值。

    // 聲明一個變量并初始化

    var a = "RUNOOB"

    // 沒有初始化就為零值

    var b int

    fmt.Println(b)

    // bool 零值為 false

    var c bool

    fmt.Println(c)

以上執行個體執行結果為:

數值類型(包括complex64/128)為 0

布爾類型為 false

字元串為 ""(空字元串)

以下幾種類型為 nil:

    var i int

    var f float64

    var b bool

    var s string

    fmt.Printf("%v %v %v %q\n", i, f, b, s)

輸出結果是:

第二種,根據值自行判定變量類型。

    var d = true

    fmt.Println(d)

第三種,如果變量已經使用 var 聲明過了,再使用 := 聲明變量,就産生編譯錯誤,格式:

例如:

直接使用下面的語句即可:

intVal := 1 相等于:

可以将 var f string = "Runoob" 簡寫為 f := "Runoob":

    f := "Runoob" // var f string = "Runoob"

    fmt.Println(f)

var x, y int

var (  // 這種因式分解關鍵字的寫法一般用于聲明全局變量

    a int

    b bool

)

var c, d int = 1, 2

var e, f = 123, "hello"

//這種不帶聲明格式的隻能在函數體中出現

//g, h := 123, "hello"

func main(){

    g, h := 123, "hello"

    println(x, y, a, b, c, d, e, f, g, h)

所有像 int、float、bool 和 string 這些基本類型都屬于值類型,使用這些類型的變量直接指向存在記憶體中的值:

Go 語言變量

當使用等号 <code>=</code> 将一個變量的值指派給另一個變量時,如:<code>j = i</code>,實際上是在記憶體中将 i 的值進行了拷貝:

Go 語言變量

你可以通過 &amp;i 來擷取變量 i 的記憶體位址,例如:0xf840000040(每次的位址都可能不一樣)。

值類型變量的值存儲在堆中。

記憶體位址會根據機器的不同而有所不同,甚至相同的程式在不同的機器上執行後也會有不同的記憶體位址。因為每台機器可能有不同的存儲器布局,并且位置配置設定也可能不同。

更複雜的資料通常會需要使用多個字,這些資料一般使用引用類型儲存。

一個引用類型的變量 r1 存儲的是 r1 的值所在的記憶體位址(數字),或記憶體位址中第一個字所在的位置。

Go 語言變量

這個記憶體位址稱之為指針,這個指針實際上也被存在另外的某一個值中。

同一個引用類型的指針指向的多個字可以是在連續的記憶體位址中(記憶體布局是連續的),這也是計算效率最高的一種存儲形式;也可以将這些字分散存放在記憶體中,每個字都訓示了下一個字所在的記憶體位址。

當使用指派語句 r2 = r1 時,隻有引用(位址)被複制。

如果 r1 的值被改變了,那麼這個值的所有引用都會指向被修改後的内容,在這個例子中,r2 也會受到影響。

我們知道可以在變量的初始化時省略變量的類型而由系統自動推斷,聲明語句寫上 var 關鍵字其實是顯得有些多餘了,是以我們可以将它們簡寫為 a := 50 或 b := false。

a 和 b 的類型(int 和 bool)将由編譯器自動推斷。

這是使用變量的首選形式,但是它隻能被用在函數體内,而不可以用于全局變量的聲明與指派。使用操作符 := 可以高效地建立一個新的變量,稱之為初始化聲明。

如果在相同的代碼塊中,我們不可以再次對于相同名稱的變量使用初始化聲明,例如:a := 20 就是不被允許的,編譯器會提示錯誤 no new variables on left side of :=,但是 a = 20 是可以的,因為這是給相同的變量賦予一個新的值。

如果你在定義變量 a 之前使用它,則會得到編譯錯誤 undefined: a。

如果你聲明了一個局部變量卻沒有在相同的代碼塊中使用它,同樣會得到編譯錯誤,例如下面這個例子當中的變量 a:

   var a string = "abc"

   fmt.Println("hello, world")

嘗試編譯這段代碼将得到錯誤 <b>a declared and not used</b>。

此外,單純地給 a 指派也是不夠的,這個值必須被使用,是以使用

會移除錯誤。

但是全局變量是允許聲明但不使用的。

同一類型的多個變量可以聲明在同一行,如:

多變量可以在同一行進行指派,如:

上面這行假設了變量 a,b 和 c 都已經被聲明,否則的話應該這樣使用:

右邊的這些值以相同的順序指派給左邊的變量,是以 a 的值是 5, b 的值是 7,c 的值是 "abc"。

這被稱為 并行 或 同時 指派。

如果你想要交換兩個變量的值,則可以簡單地使用 a, b = b, a,兩個變量的類型必須是相同。

空白辨別符 _ 也被用于抛棄值,如值 5 在:_, b = 5, 7 中被抛棄。

_ 實際上是一個隻寫變量,你不能得到它的值。這樣做是因為 Go 語言中你必須使用所有被聲明的變量,但有時你并不需要使用從一個函數得到的所有傳回值。

并行指派也被用于當一個函數傳回多個傳回值時,比如這裡的 val 和錯誤 err 是通過調用 Func1 函數同時得到:val, err = Func1(var1)。