Go語(yǔ)言學(xué)習(xí)教程(五)

一、常量概述

* 常量是一個(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("不及格")

????}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容