更多關於Golang核心編程知識的文章請看:Golang核心編程(0)-目錄頁
變量是幾乎所有編程語言中最基本的組成元素。從根本上說,變量相當於是對一塊數據存儲空間的命名,程序可以通過定義一個變量來申請一塊數據存儲空間,之後可以通過引用變量名來使用這塊存儲空間。在Go語言中,常量是指編譯期間就已知且不可改變的值。常量可以是數值類型(包括整型、
浮點型和複數類型)、布爾類型、字符串類型等。
一、變量
1.1、變量聲明
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
var v9,v10 int //v9和v10都聲明爲int型
var 關鍵字的另一種用法是可以將若干個需要聲明的變量放置在一起,免得程序員需要重複寫 var 關鍵字,如下所示:
var (
v1 int
v2 string
)
1.2、變量初始化
對於聲明變量時需要進行初始化的場景, var 關鍵字可以保留,但不再是必要的元素,如下所示:
var v1 int = 10 // 正確的使用方式1
var v2 = 10 // 正確的使用方式2,編譯器可以自動推導出v2的類型
v3 := 10 // 正確的使用方式3,編譯器可以自動推導出v3的類型
指定類型已不再是必需的,Go編譯器可以從初始化表達式的右值推導出該變量應該聲明爲哪種類型,這讓Go語言看起來有點像動態類型語言,儘管Go語言實際上是不折不扣的強類型語言(靜態類型語言)。
1.3、變量賦值
在Go語法中,變量初始化和變量賦值是兩個不同的概念。下面爲聲明一個變量之後的賦值過程:
var v10 int
v10 = 123
Go語言的變量賦值與多數語言一致,但Go語言中提供了C/C++程序員期盼多年的多重賦值功能,比如下面這個交換 i 和 j 變量的語句:
i, j = j, i
在不支持多重賦值的語言中,交互兩個變量的內容需要引入一箇中間變量:
t = i; i = j; j = t;
1.4、匿名變量
我們在使用傳統的強類型語言編程時,經常會出現這種情況,即在調用函數時爲了獲取一個值,卻因爲該函數返回多個值而不得不定義一堆沒用的變量。在Go中這種情況可以通過結合使用多重返回和匿名變量來避免這種醜陋的寫法,讓代碼看起來更加優雅。
假設GetName()
函數的定義如下,它返回3個值,分別爲 firstName
、 lastName
和
nickName
:
func GetName() (firstName, lastName, nickName string) {
return "May", "Chan", "Chibi Maruko"
}
若只想獲得nickName
,則函數調用語句可以用如下方式編寫:
_, _, nickName := GetName()
二、常量
在Go語言中,常量是指編譯期間就已知且不可改變的值。常量可以是數值類型(包括整型、浮點型和複數類型)、布爾類型、字符串類型等。
2.1、字面常量
所謂字面常量(literal),是指程序中硬編碼的常量,如:
3.14159265358979323846 // 浮點類型的常量
3.2+12i // 複數類型的常量
true // 布爾類型的常量
"foo" // 字符串常量
2.2、常量定義
通過 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", 無類型整型和字符串常量
2.3、預定義常量
Go語言預定義了這些常量: true
、 false
和 iota
。
iota 比較特殊,可以被認爲是一個可被編譯器修改的常量,在每一個 const 關鍵字出現時被重置爲0,然後在下一個 const 出現之前,每出現一次 iota ,其所代表的數字會自動增1。
從以下的例子可以基本理解 iota 的用法:
const ( // iota被重設爲0
c0 = iota // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2
)