一、常量概述
* 常量是一個(gè)固定值,在編譯器就確定結(jié)果.聲明時(shí)必須賦值且結(jié)果不可以改變.
* 因?yàn)槌A吭诰幾g器就確定,可以防止程序運(yùn)行過(guò)程中意外修改
* 常量關(guān)鍵字const
* 常量定義完可以不使用
* Go語(yǔ)言中常量定義沒(méi)有明確語(yǔ)法要求,可以不全大寫(xiě),駝峰即可.
* 很多內(nèi)容可以定義成常量
????* 人名
????* 圓周率
????* 電話號(hào)
????* 等
二、常量定義
* 定義常量時(shí)如果不是必須指定特定類(lèi)型,可以省略類(lèi)型,使用默認(rèn)類(lèi)型,且數(shù)值類(lèi)型常量(不定義類(lèi)型)可以直接進(jìn)行運(yùn)算
* 常量的值可以是表達(dá)式,但是不允許出現(xiàn)變量
funcmain() {
constastring="smallming"
constb=123
constc=3*2+5//不要指定類(lèi)型
constd=1.5//不要指定類(lèi)型
fmt.Printf("%T %T",c,d)//int float
fmt.Println(c+d)//12.5
//下面這種方式是錯(cuò)誤的
i:=3
conste=i*2+5//const initializer i * 2 + 5 is not a constant
}
* 當(dāng)定義多個(gè)常量時(shí)官方推薦的方式
const (
????????a = 1
????????b = 2
????????c = true
????)
* 定義多常量時(shí)后一個(gè)常量如果沒(méi)有賦值,與前一個(gè)常量值相同.
????* 第一個(gè)常量必須賦值
func main() {
????const (
????????a = 1
????????b
????????c
????)
????fmt.Println(a,b,c)//輸出:1 1 1
}
三、常量生成器
* 當(dāng)一組常量都是數(shù)值類(lèi)型,可以使用常量生成器iota指定這組常量按照特定規(guī)則變化
* iota起始值為0,每次增加1
func main() {
????const (
????????a = iota
????????b
????????c
????)
????fmt.Println(a, b, c) //輸出: 0 1 2
????const (
????????d = iota << 1
????????e
????????f
????)
????fmt.Println(d, e, f) //輸出:0 2 4
}
* 無(wú)論是否使用iota,一組常量中每個(gè)的iota值是固定的,iota按照順序自增1
* 每組iota之間無(wú)影響
func main() {
????const (
????????a = 5????//iota=0
????????b = 3????//iota=1
????????c = iota //iota=2
????????d????????//iota=3
????)
????fmt.Println(a, b, c, d) //輸出5 3 2 3
????const (
????????e = iota //iota=0
????????f????????//iota=1
????????g = 10???//iota=2
????????h????????//iota=3
????????i = iota //iota=4
????????j????????//iota=5
????)
????fmt.Println(e, f, g, h, i, j) // 0 1 10 10 4 5
}
四、變量地址
* 變量本質(zhì)就是內(nèi)存中一塊數(shù)據(jù)的標(biāo)記。把值存儲(chǔ)到變量中實(shí)質(zhì)是把值存儲(chǔ)到內(nèi)存中
* 每次對(duì)變量重新賦值就是在修改變量地址中的內(nèi)容
* 在Go語(yǔ)言中可以通過(guò) &+變量名 獲取到變量地址值
* 重新創(chuàng)建一個(gè)非引用型變量(即使是把已有變量直接賦值給新變量)也會(huì)新開(kāi)辟內(nèi)存地址.
二、指針變量
* 指針變量指向一個(gè)值的內(nèi)存地址
* 使用&+變量 返回值就是一個(gè)指針類(lèi)型
* 使用var 變量名 *類(lèi)型 聲明指針類(lèi)型變量
* 聲明指針不會(huì)開(kāi)辟內(nèi)存地址,只是準(zhǔn)備要指向內(nèi)存某個(gè)空間,而聲明變量會(huì)開(kāi)辟內(nèi)存地址,準(zhǔn)備存放內(nèi)容。所以指針類(lèi)型變量都是把一個(gè)變量的地址賦值給指針變量
* 使用*+指針能夠獲取內(nèi)存地址中的值.所以*+指針就和直接使用變量是相同的
* 應(yīng)用指針可以實(shí)現(xiàn)多個(gè)地方操作同一個(gè)內(nèi)存地址的值(在方法參數(shù)應(yīng)用指針較多)
func main() {
????//創(chuàng)建變量
????a := 123
????var point *int
????point = &a //此時(shí)point和&a是相等的
????fmt.Println(point)
????*point = 3?????????????//等價(jià)于a=3
????fmt.Println(*point, a) //*point和a是相當(dāng)?shù)?/p>
}
三、空指針
* 指針目的就是指向內(nèi)存中一塊地址
* 聲明指針后指針不會(huì)指向任何內(nèi)存地址,所以此時(shí)指針是空.在Go語(yǔ)言中空用nil表示
func main() {
????var a *int
????fmt.Println(a)????????//輸出:<nil>
????fmt.Println(a == nil) //輸出true
}
四、new函數(shù)
* 可以通過(guò)new函數(shù)直接創(chuàng)建一個(gè)類(lèi)型的指針:變量名:=new(Type)
* 使用new函數(shù)創(chuàng)建的指針已有指向,可以使用*指針對(duì)象進(jìn)行賦值.
func main() {
????a := new(int)
????fmt.Println(a) //輸出:指針地址
????*a = 123
????fmt.Println(*a) //輸出:123
}
* 只聲明的指針變量不能直接賦值。
五、條件判斷if
* 在程序開(kāi)發(fā)中經(jīng)常需要判斷.根據(jù)情況不同,程序執(zhí)行的分支也不同.這個(gè)時(shí)候就可以使用if
* if在程序中代表如果,如果條件成立就執(zhí)行,否則就不執(zhí)行
* if的語(yǔ)法結(jié)構(gòu),在編譯器中表達(dá)式兩側(cè)可以寫(xiě)小括號(hào),但是通常省略
* 在if語(yǔ)法結(jié)構(gòu)中所有表達(dá)式最終結(jié)果都是bool類(lèi)型,true代表成立并執(zhí)行對(duì)應(yīng)代碼
* 可以在if 表達(dá)式中聲明變量,這個(gè)變量的范圍只在if中能夠使用
* 多個(gè)單獨(dú)if使用時(shí)相互沒(méi)有影響
func main() {
????score := 65
????if score >= 60 {
????????fmt.Println("及格")
????}
????if score < 60 {
????????fmt.Println("不及格")
????}
}
六、程序調(diào)試
* 程序調(diào)試,俗稱(chēng):debug,通過(guò)特定的手段,一個(gè)語(yǔ)句一個(gè)語(yǔ)句的觀察程序執(zhí)行過(guò)程
* debug經(jīng)常用在調(diào)錯(cuò)中,當(dāng)結(jié)果不符合預(yù)期,代碼又很多時(shí),debug可以找出哪行出現(xiàn)問(wèn)題
* 程序調(diào)試步驟
????* 在程序中某行前面單擊出現(xiàn)紅色圓形
????* 右鍵,選擇Debug '文件名'
????* 通過(guò)點(diǎn)擊按鈕或使用快捷鍵選擇:向下執(zhí)行(F6),進(jìn)入調(diào)用(F5),向上跳出(F7)觀察程序
七、if ... else 結(jié)構(gòu)
* if 可以單獨(dú)使用也可以結(jié)合else使用,當(dāng)滿(mǎn)足互斥條件時(shí)使用if...else結(jié)構(gòu)
* if..else結(jié)構(gòu)中如果if成立執(zhí)行if否則執(zhí)行else
func main() {
????i := 59
????if i >= 60 {
????????fmt.Println("及格")
????} else{
????fmt.Println("不及格")
????}
}
* if每種結(jié)構(gòu)都可以相互嵌套
* 理論講if可以很多層嵌套
* 當(dāng)需要判斷多個(gè)條件時(shí)使用if ... else if .... else結(jié)構(gòu)
* 這個(gè)結(jié)構(gòu)是一個(gè)整體.只要有一個(gè)條件成立后面的都不判斷,立即結(jié)束
* else可以沒(méi)有
* 改寫(xiě)嵌套代碼,修改如下
func main() {
????score := 77
????if score >= 90 {
????????fmt.Println("優(yōu)秀")
????} else if score >= 80 {
????????fmt.Println("良好")
????} else if score >= 70 {
????????fmt.Println("中等")
????} else if score >= 60 {
????????fmt.Println("及格")
????} else {
????????fmt.Println("不及格")
????}
}