go-005-變量
概述
變量來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變量可以通過變量名訪問。
Go 語言變量名由字母、數字、下劃線組成,其中首個字母不能為數字。
聲明變量的一般形式是使用 var 關鍵字:
var identifier type
一、變量聲明
1、默認形式,聲明後若不賦值,使用默認值
var v_age string
v_age = value
2、根據值自行判定變量類型
var v_name = value
3、省略var, 註意 :=左側的變量不應該是已經聲明過的,否則會導致編譯錯誤。可以高效地創建一個新的變量,稱之為初始化聲明,只能在函數體中出現
v_name := value // 例如 var a int = 10 var b = 10 c : = 10
二、多變量聲明
//1、類型相同多個變量, 非全局變量 var vname1, vname2, vname3 type vname1, vname2, vname3 = v1, v2, v3 //2.和python很像,不需要顯示聲明類型,自動推斷
var vname1, vname2, vname3 = v1, v2, v3
//3.出現在:=左側的變量不應該是已經被聲明過的,否則會導致編譯錯誤,這種不帶聲明格式的只能在函數體中出現
vname1, vname2, vname3 := v1, v2, v3
//4.這種因式分解關鍵字的寫法一般用於聲明全局變量 var ( vname1 v_type1 vname2 v_type2 )
三、值類型和引用類型
值類型
所有像 int、float、bool 和 string 這些基本類型都屬於值類型,使用這些類型的變量直接指向存在內存中的值:
當使用等號 =
將一個變量的值賦值給另一個變量時,如:j = i
,實際上是在內存中將 i 的值進行了拷貝:
可以通過 &i 來獲取變量 i 的內存地址,例如:0xf840000040(每次的地址都可能不一樣)。值類型的變量的值存儲在棧中。
內存地址會根據機器的不同而有所不同,甚至相同的程序在不同的機器上執行後也會有不同的內存地址。因為每臺機器可能有不同的存儲器布局,並且位置分配也可能不同。
引用類型
一個引用類型的變量 r1 存儲的是 r1 的值所在的內存地址(數字),或內存地址中第一個字所在的位置。
這個內存地址為稱之為指針,這個指針實際上也被存在另外的某一個字中。
同一個引用類型的指針指向的多個字可以是在連續的內存地址中(內存布局是連續的),這也是計算效率最高的一種存儲形式;也可以將這些字分散存放在內存中,每個字都指示了下一個字所在的內存地址。
當使用賦值語句 r2 = r1 時,只有引用(地址)被復制。
如果 r1 的值被改變了,那麽這個值的所有引用都會指向被修改後的內容,在這個例子中,r2 也會受到影響。
四、註意事項
1、局部變量,聲明必須使用
2、全局變量是允許聲明但不使用
3、空白標識符 _ 也被用於拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。
_ 實際上是一個只寫變量,你不能得到它的值。這樣做是因為 Go 語言中你必須使用所有被聲明的變量,但有時你並不需要使用從一個函數得到的所有返回值。
4、並行賦值也被用於當一個函數返回多個返回值時,比如這裏的 val 和錯誤 err 是通過調用 Func1 函數同時得到:val, err = Func1(var1)。
五、常量
1、基礎定義
常量是一個簡單值的標識符,在程序運行時,不會被修改的量。
常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和復數)和字符串型。
常量的定義格式:
const identifier [type] = value
你可以省略類型說明符 [type],因為編譯器可以根據變量的值來推斷其類型。
-
- 顯式類型定義:
const b string = "abc"
- 隱式類型定義:
const b = "abc"
- 顯式類型定義:
2、用作枚舉
const ( Unknown = 0 Female = 1 Male = 2 )
數字 0、1 和 2 分別代表未知性別、女性和男性。
3、常量表達式
常量可以用len(), cap(), unsafe.Sizeof()常量計算表達式的值。常量表達式中,函數必須是內置函數,否則編譯不過:
package main import "unsafe" const ( a = "abc" b = len(a) c = unsafe.Sizeof(a) ) func main(){ println(a, b, c) } //以上實例運行結果為: //abc 3 16
4、特殊常量iota
iota,特殊常量,可以認為是一個可以被編譯器修改的常量。
在每一個const關鍵字出現時,被重置為0,然後再下一個const出現之前,每出現一次iota,其所代表的數字會自動增加1。
iota 可以被用作枚舉值:
const ( a = iota b = iota c = iota )
第一個 iota 等於 0,每當 iota 在新的一行被使用時,它的值都會自動加 1;所以 a=0, b=1, c=2 可以簡寫為如下形式:
const ( a = iota b c )
5、iota 用法
package main import "fmt" func main() { const ( a = iota //0 b //1 c //2 d = "ha" //獨立值,iota += 1 e //"ha" iota += 1 f = 100 //iota +=1 g //100 iota +=1 h = iota //7,恢復計數 i //8 ) fmt.Println(a,b,c,d,e,f,g,h,i) } //以上實例運行結果為: //0 1 2 ha ha 100 100 7 8View Code
6、iota 實例
package main import "fmt" const ( i=1<<iota j=3<<iota k l ) func main() { fmt.Println("i=",i) fmt.Println("j=",j) fmt.Println("k=",k) fmt.Println("l=",l) } //以上實例運行結果為: //i= 1 //j= 6 //k= 12 //l= 24View Code
iota表示從0開始自動加1,所以i=1<<0,j=3<<1(<<表示左移的意思),即:i=1,j=6,這沒問題,關鍵在k和l,從輸出結果看,k=3<<2,l=3<<3。
go-005-變量