變量:
變量是計算機語言中能儲存特定類型計算結(jié)果或能表示特定類型值的抽象概念
聲明變量及變量賦值:
go語言中聲明變量有多種方法埠巨,聲明單個變量最基本語法如下:
var 變量名稱 變量類型
例如:
var a int//聲明一個int類型的變量
以上的代碼聲明了一個int類型的變量a荠诬,但是沒有給變量a賦值,go會自動給變量初始化,會給變量a賦值int類型的零值0,使用=可以給變量賦值
package main
import "fmt"
func main() {
var a int
fmt.Println(a)//會輸出0
}
在聲明變量時也可以不指定變量類型诸典,當(dāng)聲明變量時同時給變量初始化,go語言可以自動推斷具有初始值的變量類型
var a = 12//自動推斷出變量a的類型為int
go中聲明變量還有一種簡便寫法崎苗,使用:=聲明變量狐粱,該方式只能出現(xiàn)在函數(shù)體中,語法如下
變量名稱:=變量值
該簡便寫法要求:=左邊的變量必須有初始值胆数,而且左邊的變量必須有未聲明的變量
package main
import "fmt"
func main() {
var b
a := 12//簡便方式聲明變量并進行初始化
b := 1//變量b已經(jīng)聲明過肌蜻,所以此處會報錯 no new variables on left side of :=
fmt.Println(a,b)
}
go語言中可以通過一條語句聲明多個變量,語法如下:
var 變量1,變量2... 變量類型
通過這種方法聲明的變量幅慌,指定了變量類型宋欺,所以聲明的變量都是同一種類型轰豆。省略變量類型并給變量進行初始化胰伍,可以通過go的自動推斷變量的類型
package main
import "fmt"
func main() {
var a,b int = 1,2//同時聲明了兩個int類型的變量并進行初始化
fmt.Println(a,b)
var aa,bb = "12aaa",5//同時聲明了兩個變量齿诞,變量aa類型為string,變量bb類型為int
fmt.Println(aa,bb)
}
使用:=的簡便方法也可以一次聲明多個變量骂租,簡便方法聲明多個變量必須進行初始化祷杈,并且左邊的變量至少有一個是未聲明的變量
package main
import "fmt"
func main() {
a,b := 1,"b"http://同時聲明了兩個變量并進行初始化
fmt.Println(a,b)//輸出1 b
//同時聲明了三個個變量,變量cc未初始化會報錯assignment mismatch: 3 variable but 2 values
//aa,bb,cc := "12aaa",5
a,b,c := 2,"bb",4//可以運行渗饮,雖然變量a和b是已經(jīng)聲明過的變量但汞,但是變量c是未聲明的變量,要注意已經(jīng)聲明過的變量類型不能改變
fmt.Println(a,b,c)//輸出2 bb 4
}
go中還有另一種一次聲明多個變量的方法互站,并且可以聲明不同類型的變量私蕾,這種方法多用于聲明全局變量
package main
import "fmt"
//該方式中如果不給變量初始化需要指定變量類型,該方式中不能用簡便寫法:=
var(
a = 1
b string = "b"
c int
d = true
)
func main() {
fmt.Println(a,b,c,d)
}
特殊變量"_":
go語言中胡桃,下劃線是一個特殊的變量也稱作空白標(biāo)識符(匿名變量)踩叭,代表忽略的變量。匿名變量不占用命名空間翠胰,不會分配內(nèi)存容贝。匿名變量與匿名變量之間也不會因為多次聲明而無法使用
package main
import "fmt"
func main() {
//調(diào)用test()函數(shù),最后一個返回值忽略掉
a,b,_ := test()
fmt.Println(a,b)//輸出1 true
}
//返回三個不同類型返回值的函數(shù)
func test()(int,bool,string){
a,b,c := 1,true,"c"
return a,b,c
}
變量的可見性規(guī)則:
大寫字母開頭的變量是公有變量之景;
小寫字母開頭的變量是私有變量斤富;
常量:
常量一般用于表示固定的值,并且在程序運行時锻狗,是不會被修改的量
常量存儲的位置在數(shù)據(jù)區(qū)满力,常量不能使用&獲取地址訪問;變量存儲于棧區(qū)轻纪,棧區(qū)脚囊,系統(tǒng)為每一個應(yīng)用程序分配1M空間存變量,程序運行結(jié)束后自動釋放
聲明常量及常量賦值:
go中常量的數(shù)據(jù)類型只能是布爾型桐磁、數(shù)字型(整數(shù)型悔耘、浮點型和復(fù)數(shù))和字符串型,常量的聲明格式如下
const 常量名 常量類型 = 常量值//該方式稱為常量的顯示定義
或
const 常量名 = 常量值//該方式稱為常量的隱式定義
常量的聲明也可以一行語句聲明多個統(tǒng)一類型常量
const 常量1,常量2... 常量類型 = 常量1的值,常量2的值
或
const 常量1,常量2 = 常量1的值,常量2的值
一次性生成多個不同類型常量語法如下
const(
常量1 常量類型 = 常量值
常量2 常量類型 = 常量值
...
)
常量在聲明后無法重新給常量賦值我擂,會報錯cannot assign to xxx
package main
import "fmt"
func main() {
const a = 6
a = 7//常量不能重新賦值衬以,報錯cannot assign to a
fmt.Println(a)
}
特殊常量iota:
iota是一個特殊的常量,可以認為是一個可以被編譯器修改的常量校摩,只能在常量中使用看峻,不能在函數(shù)體中使用;iota相當(dāng)于枚舉衙吩,多用于生成一組相似規(guī)則初始化的常量互妓;iota在const關(guān)鍵字出現(xiàn)時將被重置為0(const內(nèi)部的第一行之前);const中每新增一行常量聲明將使iota計數(shù)一次(iota可理解為const語句塊中的行索引);
package main
import "fmt"
const (
a = iota//此時a的值為iota的默認值0
//每當(dāng)iota在新的一行使用時冯勉,值都會加1
b = iota
c = iota
)
const d = iota//iota在const關(guān)鍵字出現(xiàn)時將被重置為0
func main() {
fmt.Println(a,b,c,d)//輸出0 1 2 0
}
在const總iota每增一行值就加1澈蚌,不管兩個iota中間是否有其他不是iota的常量
package main
import "fmt"
const (
a = iota//此時a的值為iota的默認值0
_//匿名變量,忽略該變量
b = "bbb"
c = iota//未有新的const關(guān)鍵字,iota在新的一行使用時灼狰,值都會加1宛瞄,所以c的值為3
)
func main() {
fmt.Println(a,b,c)//輸出0 bbb 3
}
定義iota常量時,寫在同一行的值相同交胚,換行的值加一
package main
import "fmt"
func main(){
const(
a=iota
b,c=iota,iota//定義iota常量時份汗,寫在同一行的值相同,換行的值加一
d,e
)
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
}
iota常用法:
1.跳值使用法:
package main
import "fmt"
const (
a = iota//此時a的值為iota的默認值0
_//匿名變量,忽略該變量
b = iota//未有新的const關(guān)鍵字蝴簇,iota在新的一行使用時杯活,值都會加1,所以b的值為2
)
func main() {
fmt.Println(a,b)//輸出0 2
}
2.插隊使用法
package main
import "fmt"
const (
a = iota//此時a的值為iota的默認值0
//iota不管兩個iota中間是否有其他不是iota的常量
b = "bbb"
c = iota//未有新的const關(guān)鍵字熬词,iota在新的一行使用時轩猩,值都會加1,所以c的值為2
)
func main() {
fmt.Println(a,b,c)//0 bbb 2
}
3.表達式隱式使用法
package main
import "fmt"
const (
a = iota//a=0
b//b=1
c//c=2
)
const (
aa = iota + 1//iota默認值為0荡澎,aa=0+1
bb//默認使用上一行表達式均践,并且iota遇到新的一行加1,bb=1+1
cc = iota//新的一行摩幔,iota加1彤委,cc=2
dd
)
func main() {
fmt.Println(a,b,c)//輸出0 1 2
fmt.Println(aa,bb,cc,dd)//1 2 2 3
}
4.單行使用法
使用默認上一行表達式,需要與上一行格式對應(yīng)或衡,例如上一行如果是聲明兩個常量焦影,下一行也需要聲明兩個,這樣才能默認使用上一行表達式封断,否則會報錯extra expression in const declaration
package main
import "fmt"
const (
a,b = iota,iota + 1//同屬于一行斯辰,iota不增加,a=0坡疼,b=1
c,d//默認使用上一行表達式彬呻,iota加1,c=1,d=1+1
e = iota//e=2,前面都是多個常量柄瑰,此時如果聲明一個常量需要顯式賦值闸氮,因為無法應(yīng)用默認上一行表達式,會報錯
)
func main() {
fmt.Println(a,b,c,d,e)//輸出0 1 1 2 2
}
5.生成枚舉值
go語言中沒有枚舉教沾,可以使用iota模擬枚舉
package main
import "fmt"
//模擬枚舉
const (
turnRight = iota//生成枚舉值蒲跨,iota默認值為0
turnLeft
goStraight
)
func main() {
fmt.Print("右轉(zhuǎn):")
fmt.Println(turnRight)
fmt.Print("左轉(zhuǎn):")
fmt.Println(turnLeft)
fmt.Print("直行:")
fmt.Println(goStraight)
/*
輸出
右轉(zhuǎn):0
左轉(zhuǎn):1
直行:2
*/
}