go語言變量與常量

變量:

變量是計算機語言中能儲存特定類型計算結(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
    */
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市授翻,隨后出現(xiàn)的幾起案子或悲,更是在濱河造成了極大的恐慌孙咪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巡语,死亡現(xiàn)場離奇詭異翎蹈,居然都是意外死亡,警方通過查閱死者的電腦和手機捌臊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兜材,“玉大人理澎,你說我怎么就攤上這事∈锕眩” “怎么了糠爬?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長举庶。 經(jīng)常有香客問我执隧,道長,這世上最難降的妖魔是什么户侥? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任镀琉,我火速辦了婚禮,結(jié)果婚禮上蕊唐,老公的妹妹穿的比我還像新娘屋摔。我一直安慰自己,他們只是感情好替梨,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布钓试。 她就那樣靜靜地躺著,像睡著了一般副瀑。 火紅的嫁衣襯著肌膚如雪弓熏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天糠睡,我揣著相機與錄音挽鞠,去河邊找鬼。 笑死狈孔,一個胖子當(dāng)著我的面吹牛滞谢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播除抛,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼狮杨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了到忽?” 一聲冷哼從身側(cè)響起橄教,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤清寇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后护蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體华烟,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年持灰,在試婚紗的時候發(fā)現(xiàn)自己被綠了盔夜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡堤魁,死狀恐怖喂链,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妥泉,我是刑警寧澤椭微,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站盲链,受9級特大地震影響蝇率,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刽沾,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一本慕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侧漓,春花似錦间狂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至何鸡,卻和暖如春纺弊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骡男。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工淆游, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隔盛。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓犹菱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吮炕。 傳聞我的和親對象是個殘疾皇子腊脱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容