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