Go 指针,标识符命名规范及关键字
生活随笔
收集整理的這篇文章主要介紹了
Go 指针,标识符命名规范及关键字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#### Go 指針,標識符命名規范,關鍵字,運算符
回顧了一下之前寫的文章,以及考慮到后期的內容較多, 從這篇開始逐漸增加文章內容;
這篇我們主要學習一Go 中的指針,標識符關鍵字以及運算符
##### 指針
介紹: Go 中的指針相比于C 中的指針,弱化了;基本數據類型,變量存儲的是值,也稱為值類型; 獲取變量的地址,使用&: 例如: var a int, 獲取a 的地址為: &a; package mainimport "fmt"func main() {var a int = 10fmt.Println(a)// 獲取變量a 的地址fmt.Printf("a address is %p\n",&a)//0xc000054080// 基本數據類型a 在內存中的布局// 變量a指向10, 10 的內存地址為: 0xc000054080 }
指針類型: 指針變量存儲的是一個內存地址,這個內存地址指向的空間存的才是值;
如var b *int = &a
獲取指針類型所指向的值使用\*;
如: var b \*int , 使用\*b 獲取b 指向的值;
通過指針更改基本類型的值;
如: var b \*int, 使用*b = 20, 來更改基本類型的值; package mainimport "fmt"func main() {var a int = 10// 變量 b 是一個指針變量,類型為*intvar b *int = &a // 內存布局如下:// 變量a指向10, 10 的內存地址為: 0xc000054080// 指針變量b 指向0xc000054080, 0xc00054080 地址指向10fmt.Printf("a address is %p\n") //0xc000054080fmt.Printf("b value is %p\n") //0xc000054080fmt.Println("b pointed value is",*b) //10// 通過指針更改變量的值,并不會改變原來的內存地址*b = 100 fmt.Println("a value is",a)//100 }
指針使用的細節
1. 值類型都有對應的指針類型,形式為\*數據類型, 如int 類型的對應指針是*int,int32類型的對應指針為*int32;
2. ***指類型包括:基本數據類型int系列,float系列,bool,string;數組和結構體struct***
##### 值類型和引用類型
值類型:***指類型包括:基本數據類型int系列,float系列,bool,string;數組和結構體struct***
引用類型: 指針,slice 切片, map, 管道chan,接口interface都是引用類型;
1. 值類型: 變量直接存儲的值,內存通常在棧中分配
2. 引用類型: 變量存儲的是一個內存地址,這個地址指向的空間才真正存儲的值,內存通常在堆上分配,如果沒有任何變量引用這個地址時,該地址對應的
數據空間就成為一個垃圾,由GC 來回收 var a = 100 // a --> 100 var b = &a // b --> 地址 --> 100
##### 標識符及命名規范
Go 對各種變量,方法,函數等命名時使用的字符序列稱為標識符;
也可以這樣說: 凡是程序員可以自己起名稱的地方都叫標識符;
規則:
1. 由26 個英文字母大小寫,0-9,_ 組成 ;
2. 數字不可以開頭;
3. 嚴格區分大小寫;
4. 標識符不能包含空格;
5. 不能使用系統保留的關鍵字作為標識符;
6. ***下劃線_本身在Go中是一個特殊的標識符,稱為空標識符,它可以代表任意的其它字符,但是它的值會被忽略
單一_僅能被作為占位符使用,不能作為標識符使用;***
7. 除了第6條外,與其它語言基本規則一樣,在命名時注意即可;
---
標識符命名注意事項
1. 包名: 保持package 的名字和目錄的名稱一致,盡量采用有意思的名稱,最好不和標準庫沖突;
2. 變量名,函數名,常量名采用駝峰命名法;
3. 如果變量名,函數名,常量名首字母大寫,則可以被其它的包訪問,如果首字母小寫,則只能在本包中使用(首字母大寫是公開的,首字母小寫是私有的,類似其它語言中的public,private 關鍵字)
##### 系統保留關鍵字(25個)
##### 預定義的標識符(36個)
包括基礎數據類型和系統內嵌函數
##### 運算符
運算符是一種特殊的符號,用以表示數據的運算,賦值和比較等;
1. 算術運算符
2. 賦值運算符
3. 比較運算符/關系運算符
4. 邏輯運算符
5. 位運算符
6. 其它運算符
---
##### 算術運算符
算術運算符是對數值類型的變量進行運算,如下:
案例: package mainimport "fmt"func main() {var a int = 10var b int = 3fmt.Println(a+b) //13fmt.Println(a-b) //7fmt.Println(a*b) //30// 注意: 如果運算的數全是整數,那么結果保留整數部分fmt.Println(a/b) //3var c float64 = 10 / 3 // 3// 如果需要保留小數部分,則需要浮點數參與運算var d float64 = 10.0 / 3 // 3.333333...fmt.Println(c,d)// % 的使用// a % b = a- a/b*b // 這是一個公式fmt.Println("10 %3 = ",10%3) // 1fmt.Println("-10 %3 = ",-10%3) //(-10)-(-10)/3*3 = -1fmt.Println("10 %-3 = ",10%-3)//10-10/(-3)*(-3) = 1fmt.Println("-10%-3 = ",-10%-3) // (-10)-(-10)/(-3)*(-3) = -1var e = 1e ++fmt.Println(e) //2e--fmt.Println(e) //1 }
算術運算符使用的注意事項
1. 對于除號, 它的整數除和小數除是有區別的,整數除時只保留整數部分;
2. 取模時%, 可以參考公式: a%b = a-a/b*b;
3. Go 的自增和自減只能作為獨立語句使用;
4. ++ 和 -- 只能寫在變量后,沒有--a,和++a;
---
##### 關系型運算符(比較運算符)
關系型運算符的結果都是bool 類型的,要么是true , 要么是false, 經常使用在條件控制語句中; package mainimport "fmt"func main() {var a = 1var b = 2fmt.Println(a>b) // falsefmt.Println(a<b) // truefmt.Println(a==b) // falsefmt.Println(a!=b) // truefmt.Println(a<=b) // truefmt.Println(a>=b) // falseresu := a>bfmt.Println(resu) // false }
---
關系型運算符使用注意事項:
1. 運算結果都是bool 類型,true or false;
2. 比較運算符"==" 不能寫成"=", "=" 是賦值 ;
##### 邏輯運算符
假如: a = true, b = false
a && b = false // 兩邊同時為true ,結果為true,否則為false
a || b = true // 兩邊同時為false ,結果為false,否則為true
!a = false, !b = true // 取反,!true=false, !false=true
案例: package mainimport "fmt"func main() {var a = 2// 兩邊不同時為true, 結果為falsefmt.Println(a > 2 && a < 3) // false// 兩邊同時為true,結果為truefmt.Println(a >1 && a <3 ) // true// 兩邊有一個為true,結果為truefmt.Println(a >2 || a < 3) // true// 兩邊同時為false,結果為falsefmt.Println(a >2 || a <1 ) // falsefmt.Println(a > 2) // false// 取反fmt.Println(!(a>2)) // true }
---
邏輯運算符使用注意事項
1. && 也稱為短路與: 如果第一個條件為false, 則第二個條件不會判斷,結果為false;
2. || 也稱為短路或: 如果第一個條件為true, 則第二個條件不會判斷,結果為true; package mainimport "fmt"func test() bool {fmt.Println("hello,world")return true } func main() {var a = 2if a < 1 && test() { // false , test() 函數不會執行fmt.Println("yes")}if a > 1 || test() { // true, test() 函數不會執行fmt.Println("yes")} }
##### 賦值運算符
賦值運算符就是將運算后的值,賦值給指定的變量;
分類:
1. = , 如: a3 = a1 + a2
2. +=, 如: a3 += a1,等價于 a3 = a3 + a1
3. -=, 如: a3 -= a1,等價于 a3 = a3 - a1
4. *=, 如: a3 *= a1,等價于 a3 = a3 * a1
5. /=, 如: a3 /= a1,等價于 a3 = a3 / a1
5. %=, 如: a3 %= a1,等價于 a3 = a3 % a1
案例: package mainimport "fmt"func main() {var a1 = 1var a2 = 2a3 := a1 + a2fmt.Println(a3)a3 += a1 // a3 = a3 + a1 ====> 3+1fmt.Println(a3) // 4// 在這里演示一個小案例,用來體驗一下Go 賦值運算符的使用// 交換兩個變量的值var a = 10var b = 20// Go 中支持多變量賦值a, b = b, a // 正確fmt.Println(a, b) // 20,10// 使用另一種方式實現a = a + bb = a - b // a +b -b = aa = a - b // a +b -a = bfmt.Println(a, b) //10,20 , 上面已經交換過,這里恢復 }
---
賦值運算符的使用注意事項
1. 運算順序從右往左;
2. 賦值運算符的左邊只能是變量,右邊可以是變量,表達式,常量值;
##### 位運算符
位運算符涉及到二進制運算,實際使用過程中并不是太多,這里先不寫......
##### 運算符的優先級
從高到低
1. (),++,--
2. 單目運算: !,&,*
3. 移位運算: <<,>>
4. 位運算: |,&,^
5. 算術運算: *,/,+,-
6. 關系型運算: >,<,<=,==,>=
7. 邏輯運算: &&,||
8. 賦值運算: +=,-=,*=
9. 逗號: ,
---
運算符的優先級,與其它編程語一樣,不需要過多研究,實際使用中多寫多練即可;
--------最近在同步更新微信公眾號:"開胃咸菜",最新文章以公眾號為準,可以一起學習交流;
回顧了一下之前寫的文章,以及考慮到后期的內容較多, 從這篇開始逐漸增加文章內容;
這篇我們主要學習一Go 中的指針,標識符關鍵字以及運算符
##### 指針
介紹: Go 中的指針相比于C 中的指針,弱化了;基本數據類型,變量存儲的是值,也稱為值類型; 獲取變量的地址,使用&: 例如: var a int, 獲取a 的地址為: &a; package mainimport "fmt"func main() {var a int = 10fmt.Println(a)// 獲取變量a 的地址fmt.Printf("a address is %p\n",&a)//0xc000054080// 基本數據類型a 在內存中的布局// 變量a指向10, 10 的內存地址為: 0xc000054080 }
指針類型: 指針變量存儲的是一個內存地址,這個內存地址指向的空間存的才是值;
如var b *int = &a
獲取指針類型所指向的值使用\*;
如: var b \*int , 使用\*b 獲取b 指向的值;
通過指針更改基本類型的值;
如: var b \*int, 使用*b = 20, 來更改基本類型的值; package mainimport "fmt"func main() {var a int = 10// 變量 b 是一個指針變量,類型為*intvar b *int = &a // 內存布局如下:// 變量a指向10, 10 的內存地址為: 0xc000054080// 指針變量b 指向0xc000054080, 0xc00054080 地址指向10fmt.Printf("a address is %p\n") //0xc000054080fmt.Printf("b value is %p\n") //0xc000054080fmt.Println("b pointed value is",*b) //10// 通過指針更改變量的值,并不會改變原來的內存地址*b = 100 fmt.Println("a value is",a)//100 }
指針使用的細節
1. 值類型都有對應的指針類型,形式為\*數據類型, 如int 類型的對應指針是*int,int32類型的對應指針為*int32;
2. ***指類型包括:基本數據類型int系列,float系列,bool,string;數組和結構體struct***
##### 值類型和引用類型
值類型:***指類型包括:基本數據類型int系列,float系列,bool,string;數組和結構體struct***
引用類型: 指針,slice 切片, map, 管道chan,接口interface都是引用類型;
1. 值類型: 變量直接存儲的值,內存通常在棧中分配
2. 引用類型: 變量存儲的是一個內存地址,這個地址指向的空間才真正存儲的值,內存通常在堆上分配,如果沒有任何變量引用這個地址時,該地址對應的
數據空間就成為一個垃圾,由GC 來回收 var a = 100 // a --> 100 var b = &a // b --> 地址 --> 100
##### 標識符及命名規范
Go 對各種變量,方法,函數等命名時使用的字符序列稱為標識符;
也可以這樣說: 凡是程序員可以自己起名稱的地方都叫標識符;
規則:
1. 由26 個英文字母大小寫,0-9,_ 組成 ;
2. 數字不可以開頭;
3. 嚴格區分大小寫;
4. 標識符不能包含空格;
5. 不能使用系統保留的關鍵字作為標識符;
6. ***下劃線_本身在Go中是一個特殊的標識符,稱為空標識符,它可以代表任意的其它字符,但是它的值會被忽略
單一_僅能被作為占位符使用,不能作為標識符使用;***
7. 除了第6條外,與其它語言基本規則一樣,在命名時注意即可;
---
標識符命名注意事項
1. 包名: 保持package 的名字和目錄的名稱一致,盡量采用有意思的名稱,最好不和標準庫沖突;
2. 變量名,函數名,常量名采用駝峰命名法;
3. 如果變量名,函數名,常量名首字母大寫,則可以被其它的包訪問,如果首字母小寫,則只能在本包中使用(首字母大寫是公開的,首字母小寫是私有的,類似其它語言中的public,private 關鍵字)
##### 系統保留關鍵字(25個)
##### 預定義的標識符(36個)
包括基礎數據類型和系統內嵌函數
##### 運算符
運算符是一種特殊的符號,用以表示數據的運算,賦值和比較等;
1. 算術運算符
2. 賦值運算符
3. 比較運算符/關系運算符
4. 邏輯運算符
5. 位運算符
6. 其它運算符
---
##### 算術運算符
算術運算符是對數值類型的變量進行運算,如下:
案例: package mainimport "fmt"func main() {var a int = 10var b int = 3fmt.Println(a+b) //13fmt.Println(a-b) //7fmt.Println(a*b) //30// 注意: 如果運算的數全是整數,那么結果保留整數部分fmt.Println(a/b) //3var c float64 = 10 / 3 // 3// 如果需要保留小數部分,則需要浮點數參與運算var d float64 = 10.0 / 3 // 3.333333...fmt.Println(c,d)// % 的使用// a % b = a- a/b*b // 這是一個公式fmt.Println("10 %3 = ",10%3) // 1fmt.Println("-10 %3 = ",-10%3) //(-10)-(-10)/3*3 = -1fmt.Println("10 %-3 = ",10%-3)//10-10/(-3)*(-3) = 1fmt.Println("-10%-3 = ",-10%-3) // (-10)-(-10)/(-3)*(-3) = -1var e = 1e ++fmt.Println(e) //2e--fmt.Println(e) //1 }
算術運算符使用的注意事項
1. 對于除號, 它的整數除和小數除是有區別的,整數除時只保留整數部分;
2. 取模時%, 可以參考公式: a%b = a-a/b*b;
3. Go 的自增和自減只能作為獨立語句使用;
4. ++ 和 -- 只能寫在變量后,沒有--a,和++a;
---
##### 關系型運算符(比較運算符)
關系型運算符的結果都是bool 類型的,要么是true , 要么是false, 經常使用在條件控制語句中; package mainimport "fmt"func main() {var a = 1var b = 2fmt.Println(a>b) // falsefmt.Println(a<b) // truefmt.Println(a==b) // falsefmt.Println(a!=b) // truefmt.Println(a<=b) // truefmt.Println(a>=b) // falseresu := a>bfmt.Println(resu) // false }
---
關系型運算符使用注意事項:
1. 運算結果都是bool 類型,true or false;
2. 比較運算符"==" 不能寫成"=", "=" 是賦值 ;
##### 邏輯運算符
假如: a = true, b = false
a && b = false // 兩邊同時為true ,結果為true,否則為false
a || b = true // 兩邊同時為false ,結果為false,否則為true
!a = false, !b = true // 取反,!true=false, !false=true
案例: package mainimport "fmt"func main() {var a = 2// 兩邊不同時為true, 結果為falsefmt.Println(a > 2 && a < 3) // false// 兩邊同時為true,結果為truefmt.Println(a >1 && a <3 ) // true// 兩邊有一個為true,結果為truefmt.Println(a >2 || a < 3) // true// 兩邊同時為false,結果為falsefmt.Println(a >2 || a <1 ) // falsefmt.Println(a > 2) // false// 取反fmt.Println(!(a>2)) // true }
---
邏輯運算符使用注意事項
1. && 也稱為短路與: 如果第一個條件為false, 則第二個條件不會判斷,結果為false;
2. || 也稱為短路或: 如果第一個條件為true, 則第二個條件不會判斷,結果為true; package mainimport "fmt"func test() bool {fmt.Println("hello,world")return true } func main() {var a = 2if a < 1 && test() { // false , test() 函數不會執行fmt.Println("yes")}if a > 1 || test() { // true, test() 函數不會執行fmt.Println("yes")} }
##### 賦值運算符
賦值運算符就是將運算后的值,賦值給指定的變量;
分類:
1. = , 如: a3 = a1 + a2
2. +=, 如: a3 += a1,等價于 a3 = a3 + a1
3. -=, 如: a3 -= a1,等價于 a3 = a3 - a1
4. *=, 如: a3 *= a1,等價于 a3 = a3 * a1
5. /=, 如: a3 /= a1,等價于 a3 = a3 / a1
5. %=, 如: a3 %= a1,等價于 a3 = a3 % a1
案例: package mainimport "fmt"func main() {var a1 = 1var a2 = 2a3 := a1 + a2fmt.Println(a3)a3 += a1 // a3 = a3 + a1 ====> 3+1fmt.Println(a3) // 4// 在這里演示一個小案例,用來體驗一下Go 賦值運算符的使用// 交換兩個變量的值var a = 10var b = 20// Go 中支持多變量賦值a, b = b, a // 正確fmt.Println(a, b) // 20,10// 使用另一種方式實現a = a + bb = a - b // a +b -b = aa = a - b // a +b -a = bfmt.Println(a, b) //10,20 , 上面已經交換過,這里恢復 }
---
賦值運算符的使用注意事項
1. 運算順序從右往左;
2. 賦值運算符的左邊只能是變量,右邊可以是變量,表達式,常量值;
##### 位運算符
位運算符涉及到二進制運算,實際使用過程中并不是太多,這里先不寫......
##### 運算符的優先級
從高到低
1. (),++,--
2. 單目運算: !,&,*
3. 移位運算: <<,>>
4. 位運算: |,&,^
5. 算術運算: *,/,+,-
6. 關系型運算: >,<,<=,==,>=
7. 邏輯運算: &&,||
8. 賦值運算: +=,-=,*=
9. 逗號: ,
---
運算符的優先級,與其它編程語一樣,不需要過多研究,實際使用中多寫多練即可;
--------最近在同步更新微信公眾號:"開胃咸菜",最新文章以公眾號為準,可以一起學習交流;
轉載于:https://www.cnblogs.com/Mail-maomao/p/11357449.html
總結
以上是生活随笔為你收集整理的Go 指针,标识符命名规范及关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go 变量及基本数据类型3
- 下一篇: 本地git首次连接远程github仓库