Go語言變量的基本特性

變量聲明

Go語言中,用var關鍵字創建一個具體類型的變量,並設置它的初始值。通用形式爲:    var name type = expression

類型和表達式部分可以省略其中一個,但不能都省略。如果省略類型,變量的類型將由初始化表達式決定;如果表達式省略,其初始值對應於類型的零值——對於數字是0,對於布爾值是false,對於字符串是"",對於接口和引用類型(slice、指針、map、通道、函數等)是nil。對於數組或結構體這樣的複合類型,零值是其所有元素或成員的零值。

Go語言的零值機制確保所有的變量是良好定義的,不存在未初始化的變量。

var s string //s爲""
var i, j int //i j的類型分別爲int, int
var i, s = 1, "Hello World" //i爲int,s爲string

短變量聲明

短變量聲明符 := 可以用來聲明和初始化局部變量(非跨包),其格式爲:name := expression,name的類型由expression決定。

i := 100
x, y := 0, 1

段變量聲明短小、靈活,因而在局部變量的聲明和初始化中主要使用段變量聲明,var聲明通常是爲那些跟初始化表達式類型不一致的局部變量保留的,或者用於後面纔對變量賦值以及變量初始值不重要的情況。

短變量聲明不需要聲明所有在左邊的變量。如果一些變量在同一個詞法塊中聲明,那麼對於這些變量,短變量聲明的行爲等同於賦值。但短變量聲明最少需要聲明一個新變量,否則代碼編譯將無法通過。

變量生命週期

包級別變量的生命週期是整個程序的執行時間,局部變量有一個動態的生命週期:每次執行聲明語句時創建一個新的實例,變量一直生存到它變得不可訪問,這時它佔用的存儲空間被回收。

編譯器可以選擇使用堆或棧來分配空間,但與C/C++不同的是,這個選擇不是基於使用var或new關鍵字來聲明變量,而是變量的可達性。如下:

var global *int

func f() {
    var x int
    x = 1
    global = &x
}

func g() {
    y := new(int)
    *y = 1
}

上述代碼中,x使用堆空間,因爲它在f函數返回後還可以從global變量訪問,儘管它被聲明爲一個局部變量。相反y儘管通過new函數創建,但當g函數返回時它變得不可達,因此可以在棧中爲y分配空間。

類型聲明

type關鍵字定義一個新的命名類型,它和某個已有類型使用同樣的底層類型。其格式爲:type name underlying-type,類型聲明通常出現在包級別。

 

                                                                                                                                           本文部分內容摘自《Go程序設計語言》

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