變量
變量是幾乎所有編程語言中最基本的組成元素,從根本上說,變量相當於是一塊數據存儲空間的命名,程序可以通過定義一個變量來申請一塊數據存儲空間,之后可以通過引用變量名來使用這塊存儲空間。go語言中的變量使用方式與C語言接近,但具備更大的靈活性。
變量的聲明
go語言引入了關鍵字ver,而類型信息放在變量名之后。示例如下:
var v1 int var v2 string var v3 [10]int //數組 var v4 []int //數組切片 var v5 struct { f int } var v6 *int // 指針 var v7 map[strint]int //map,key為string類型,value為int類型 var v8 func(a int) int
變量聲明語句不需要使用分號作為結束語,與C語言相比,go語言摒棄了語句必須以分號作為語句結束標記的習慣。
var關鍵字的另一種用法是可以將若干個需要聲明的變量放置在一起,免得程序員需要重復寫var關鍵字,如下圖:
var ( v1 int v2 string )
變量初始化
對於聲明變量時需要進行初始化的場景,var關鍵字可以保留,但不再是必要的元素,如下所示:
//正確的使用方式1 var v1 int =10 //正確的使用方式2,編譯器可以自動推導出v2的類型 var v2 = 10 //正確的使用方式3,編譯器可以自動推導出v3的類型
v3 := 10
以上三種用法的效果是一樣的,與第一種用法相比,第三種用法需要輸入的字符數大大減少,這里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中這種情況可以通過結合使用多重返回和匿名變量來避免這種丑陋的寫法,讓代碼看起來更加優雅。
假設:GetNmae()函數的定義如下,它返回三個值,分別為 firstName、lastName和nickName:
func GetName() (firstName, lastName, nickName string) { return "may", "Hello", "World" }
若只想獲得nickName,則函數調用語句可以用如下方式編寫:
_, _, nickName := GetName()
這種用法可以讓代碼非常清晰,基本上屏蔽掉了可能混淆大家實現的內容,從而大幅度降低溝通的復雜度和代碼為何的難度。
常量
在go語言中常量是指編譯期間就已知且不可改變的值。常量可以是數值類型(包括整型、浮點型和復數型)、布爾類型、字符串類型等。
字面常量
所謂字面常亮(literal),是指程序中硬編碼的常量,如:
-12 3.14159265358979323856 //浮點類型的常量 3.2+12i //復數類型常量 true //布爾類型常量 "foo" //字符串常量
只要這個常量在響應類型的值域范圍內,就可以作為該類型的常量。
常量的定義
通過const關鍵字,你可以給字面常亮指定一個很友好的名字:
const Pi float64 = 3.14159265358979323846 const zero = 0.0 //無類型浮點常量 const ( size int64 = 1024 eof = -1 //無類型整數常量 ) const u, v float32 = 0, 3 // u = 0.0, v = 3.0, 常量的多場賦值 const a, b, c = 3, 4, "foo" // a = 3, b = 4, c = "foo" ,無類型整型和字符串常量
go的常量定義可以限定類型,但不是必須的,如果定義常量時沒有指定類型,那么它與字面常量一樣,是無類型常量。
預定義常量
go的語言預定義了這些常量: true , false和iota。
iota比較特殊,可以認為是一個可被編譯器修改的常量,在每一個const關鍵字出現時被重置為0,然后在下一個const出現之前,每出現一次iota,其 所代表的數字會自動增1。
從以下列子當中可以基本理解iota的用法:
const( // iota被重設為0 c0 = iota // c0 == 0 c1 = iota // c1 == 0 c2 = iota // c2 == 0 ) const ( a = 1 << iota // a ==1 (iota在每個const開頭被重設為0) b = 1 << iota // b == 2 c = 1 << iota // c == 4 ) const ( u = iota * 42 // u == 0 iota在每個const開頭被重設為0 v float64 = iota * 42 // b == 2 c = 1 << iota // c == 4 ) const( u = iota * 42 // u == 0 v float64 = iota * 42 // v == 42.0 w = iota * 42 // w == 84 ) const x = iota // x == 0 itao又被重設為0 const y = iota // y == 0 同上
如果兩個const的賦值語句的表達式是一樣的,那么可以省略后一個賦值表達式,因此,上面的前兩個const語句可簡寫為:
const ( c0 = iota // iota被重設為0 c1 // c1 == 1 c2 // c2 == 2 ) const ( a = 1 << iota // a == 1 b // b == 2 c // c == 4 )
小結: 本章只是學習go的基本的變量,變量的定義,常量等。
定義變量關鍵字: var
定義常量關鍵字 : const