變量

  變量是幾乎所有編程語言中最基本的組成元素。從根本上說,變量相當於是對一塊數據存儲空間的命名,程序可以通過定義一個變量來申請一塊數據存儲空間,之後可以通過引用變量名來使用這塊存儲空間。

聲明變量

  Go 語言的變量聲明方式與 C 和 C++ 語言有明顯的不同。對於純粹的變量聲明,Go語 言引入了
關鍵字 var,而類型信息放在變量名之後,示例如下:

var v1 int
var v2 string
var v3 [10]int // 數組
var v4 []int // 數組切片
var v5 struct {
    f int
}
var v6 *int // 指針
var v7 map[string]int // map,key爲string類型,value爲int類型
var v8 func(a int) int

  變量聲明語句不需要使用分號作爲結束符。與 C 語言相比,Go 語言摒棄了語句必須以分號作爲語句結束標記的習慣。

  var 關鍵字的另一種用法是可以將若干個需要聲明的變量放置在一起,免得程序員需要重複寫 var 關鍵字,如下所示:

var (
    v1 int
    v2 string
)

變量初始化

  對於聲明變量時需要進行初始化的場景,var 關鍵字可以保留,但不再是必要的元素,如下所示:

var v1 int = 10 // 正確的使用方式1
var v2 = 10     // 正確的使用方式2,編譯器可以自動推導出v2的類型
v3 := 10        // 正確的使用方式3,編譯器可以自動推導出v3的類型

  以上三種用法的效果是完全一樣的。與第一種用法相比,第三種用法需要輸入的字符數大大減少,是懶程序員和聰明程序員的最佳選擇。這裏 Go 語言也引入了另一個 C 和 C++ 中沒有的符號(冒號和等號的組合 :=),用於明確表達同時進行變量聲明和初始化的工作。

  指定類型已不再是必需的,Go 編譯器可以從初始化表達式的右值推導出該變量應該聲明爲哪種類型,這讓 Go 語言看起來有點像動態類型語言,儘管 Go 語言實際上是不折不扣的強類型語言(靜態類型語言)。

  當然,出現在 := 左側的變量不應該是已經被聲明過的,否則會導致編譯錯誤,比如下面這個寫法:

var i int
i := 2

  會導致類似如下的編譯錯誤:

no new variables on left side of :=

變量賦值

  在 Go 語法中,變量初始化和變量賦值是兩個不同的概念。下面爲聲明一個變量之後的賦值過程:

var v10 int
v10 = 123

  Go 語言的變量賦值與多數語言一致,但 Go 語言中提供了 C/C++ 程序員期盼多年的多重賦值功能,比如下面這個交換 i 和 j 變量的語句:

i, j = j, i

  在不支持多重賦值的語言中,交互兩個變量的內容需要引入一箇中間變量:

t = i; i = j; j = t;

  多重賦值的特性在 Go 語言庫的實現中也被使用得相當充分。總而言之,多重賦值功能讓 Go 語言與 C/C++ 語言相比可以非常明顯地減少代碼行數。

匿名變量

  我們在使用傳統的強類型語言編程時,經常會出現這種情況,即在調用函數時爲了獲取一個值,卻因爲該函數返回多個值而不得不定義一堆沒用的變量。在 Go 中這種情況可以通過結合使用多重返回和匿名變量來避免這種醜陋的寫法,讓代碼看起來更加優雅。

  假設 GetName() 函數的定義如下,它返回3個值,分別爲 firstName、lastName 和 nickName:

func GetName() (firstName, lastName, nickName string) {
    return "May", "Chan", "Chibi Maruko"
}

  若只想獲得 nickName,則函數調用語句可以用如下方式編寫:

_, _, nickName := GetName()

  這種用法可以讓代碼非常清晰,基本上屏蔽掉了可能混淆代碼閱讀者視線的內容,從而大幅降低溝通的複雜度和代碼維護的難度。

  參考:《Go語言編程》

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