go——變數
阿新 • • 發佈:2018-12-08
在數學概念中,變數(variable)表示沒有固定值且可以改變的數。
但從計算機系統實現角度來看,變數是一段或多段用來儲存資料的記憶體。
作為靜態型別語言,Go語言總是有固定的資料型別,型別決定了變數記憶體的長度和儲存格式。
通過型別轉換或指標操作,我們可以修改變數值,但是卻無法改變變數的型別。
因為記憶體分配發生在執行期,所以在編碼階段我們用一個易於閱讀的名字來表示這段記憶體。
實際上,編譯後的機器碼從不會使用變數名,而是直接通過記憶體地址來訪問目標資料。
儲存在符號表中的變數名等資訊可以被刪除,或用於輸出更詳細的錯誤資訊。
變數的命令由字母、數字和下劃線組成,其中首個字元不能為數字。
關鍵字var用於定義變數,型別被放在變數名後面。
變數定義有三種方式:
第一種:指定變數型別,聲明後若不賦值,使用預設值
var v_name v_type v_name = value
第二種:根據值自行判斷變數型別
var v_name = value
第三種: 簡短模式,省略var,注意:=左側的變數不應該是已經宣告過的,否則會導致編譯錯誤
v_name := value
執行時記憶體分配操作會確保變數自動初始化為二進位制零值(zero value),避免出現不可預測行為。
var x int //自動初始化為0
如果顯式提供初始化值,可省略變數型別,由編譯器推斷。
var y = false //自動推斷為bool型別
可一次性定義多個變數,包括用不同初始值定義不同型別。
var x, y int //一次定義相同型別的多個變數 var a, s = 100, “abc” //給不同型別初始化值
當我們需要一次定義多個變數的時候,可以以組的方式來定義,這種方式一般用來對全域性變數的定義。
var { x, y int a, s = 100, “abc” }
除了使用var關鍵字外,還可以使用更加簡短的變數定義和初始化語法。
func main() { x := 100 a,s := 1, “abc” }
需要注意的是這種簡短模式的定義方式不能提供資料型別,並且只能用在函式內部。
簡短模式並不總是定義變數,可能是部分退化的賦值操作。
package main import "fmt" func main() { x := 100 fmt.Println(&x, x) x, y := 200, "abc" //x為退化賦值操作,y才是變數定義 fmt.Println(&x, x) fmt.Println(y) } /* 結果: 0xc00004e080 100 0xc00004e080 200 //可以看出x的記憶體地址並沒有改變,只是進行了重新賦值的操作 abc */
退化賦值的前提條件是:最少有一個新變數被定義,且必須是同一作用域。
示例1:
//最少有一個新變數被定義 package main import "fmt" func main() { x := 100 fmt.Println(&x, x) x := 200 //報錯:no new variables on left side of := // x = 200 //這種方式是可行的 fmt.Println(&x, x) }
示例2:
//必須是同一作用域
package main import "fmt" func main() { x := 100 fmt.Println(&x, x) { x, y := 200, 100 fmt.Println(&x, x) fmt.Println(&y, y) } } /* 結果: 0xc00000a168 100 0xc00000a188 200 //兩次的記憶體地址不相同,已經是一個新的變數,不能視作退化賦值 0xc00000a1b0 100 */
如果你定義了一個區域性變數但是卻沒有使用它,也會報錯。
package main var flag = false //全域性變數沒有被使用沒有問題 func main() { x := 100 //沒有使用區域性變數會報錯:x declared and not used }