Golang-變量
1.定義
在程序運行過程中,其值可以發生改變的量,實質類比於一個容器。
2.變量的命名規則
- 必須使用數字、英文大小寫字母、下劃線_
- 不能使用數字開頭
- 不能使用系統關鍵字
- 變量區分大小寫
- 變量的命名要見名知意
- 小駝峯法:firstName
- 大駝峯法:FirstName
- 下劃線法:first_name[前端/python語言開發較爲常見使用]
3.變量的聲明
1.基本格式
變量聲明後,除非是全局變量,否則不使用將會被編譯器報錯。var形式的聲明語句往往是用於需要顯式指定變量類型的地方,或者因爲變量稍後會被重新賦值而初始值無關緊要的地方。
var 變量名 類型 = 表達式
1.自動推導類型
var 變量名 = 表達式
根據初始化表達式來推導變量的類型信息
2.零值初始化
var 變量名 類型
零值初始化該變量。
數值類型變量對應的零值是0,布爾類型變量對應的零值是false,字符串類型對應的零值是空字符串,接口或引用類型(包括slice、指針、map、chan和函數)變量對應的零值是nil。數組或結構體等聚合類型對應的零值是每個元素或字段都是對應該類型的零值。
零值初始化機制可以確保每個聲明的變量總是有一個良好定義的值,因此在Go語言中不存在未初始化的變量。
3.批量聲明/多重賦值
同一種類型的批量聲明(變量值進行零值初始化):
var 變量名1,變量名2,變量名3, ... 類型
不同類型的批量聲明(類型由初始化表達式推導):
var 變量名1,變量名2,變量名3, ... = 表達式1,表達式2,表達式3, ...
初始化表達式可以是字面量或任意的表達式。在包級別聲明的變量會在main入口函數執行前完成初始化,局部變量將在聲明語句被執行到的時候完成初始化。
一組變量也可以通過調用一個函數,由函數返回的多個返回值初始化:
var f, err = os.Open(name)
2.簡短變量聲明
簡短變量聲明只能用於局部變量,不能用於全局變量。自動推導的簡短類型變量的聲明語句中必須至少要聲明一個新的變量,已經聲明過的變量只有賦值行爲。
變量名 := 表達式
變量的類型根據表達式來自動推導,只能用於函數內部。
批量聲明/多重賦值
變量名1,變量名2,變量名3, ... := 表達式1,表達式3,表達式3, ...
3.匿名變量
【_】丟棄數據,不進行處理,無法對其進行輸出或者其他操作。一般用於對多個返回值的函數,只接收其中一部分,其餘的進行丟棄不處理的操作中來使用匿名函數。
var _,變量名,變量名2,... = 函數/方法()
或者
_,變量名,變量名2,... := 函數/方法()
4.變量的數據置換
1.使用中間變量
package main
func main() {
a, b := 1, 3
println("源數據:a=", a, " b=", b)
temp := a
a = b
b = temp
println("置換後:a=", a, " b=", b)
}
需要多聲明中間變量來做橋樑,多個變量進行替換代價高昂。
2.利用求和相減
package main
func main() {
a, b := 1, 3
println("源數據:a=", a, " b=", b)
a = a + b
b = a - b
a = a - b
println("置換後:a=", a, " b=", b)
}
增加計算複雜度,多個變量進行替換代價高昂。
3.使用異或
package main
func main() {
a, b := 1, 3
println("源數據:a=", a, " b=", b)
/*
1.一個數異或兩次等於其自身
2.一個數對另一個數異或,然後再對自身異或,等於另一個數
a^b^a等於b ,b^a^b 等於a
*/
println("置換後:a=", a^b^a, " b=", b^a^b)
}
增加異或計算,多個變量進行替換代價高昂。
4.利用go的多重賦值
變量1,變量2 = 變量2,變量1
package main
func main() {
a, b := 1, 3
println("源數據:a=", a, " b=", b)
a, b = b, a
println("置換後:a=", a, " b=", b)
}
5.變量的生命週期
程序運行時變量存在的有效時間段,在此時間區域內可以被程序的其他部分引用。 運行時的概念
1.全局變量
生命週期和整個程序的運行週期一致
2.局部變量
生命週期是動態的,每次從創建一個變量的聲明語句開始,直到該變量不再引用位置,變量的空間可能會被回收
一個變量的有效生命週期只取決於是否可達,因此一個循環迭代內部的局部變量的生命週期可能超出其局部變量作用域。
3.局部變量逃逸
如果將指向短生命週期對象的指針保存到具有長生命週期的對象中,特別是保存到全局變量時,會阻止對短生命週期對象的垃圾回收,從而可能影響程序的性能。
4.自動垃圾收集器的基本實現思路
從每個包級別的變量和每個當前運行函數的每一個局部變量開始,通過指針或引用的訪問路徑遍歷,判斷是否可以找到該變量。如果不存在這樣的訪問路徑,說明該變量不可達,也就意味着它是否存在並不會影響程序後續的計算結果。