Go语言学习笔记(三)---指针,运算符及流程控制
4.2.8 指針
基本介紹:1)基本數據類型,變量存的就是值,也叫值類型。2)獲取變量的地址,用&。3)指針類型,指針變量存的是一個地址,這個地址指向的空間存的才是值。4)獲取指針類型所指向的值,使用:*。
使用細節:值類型都有對應的指針類型,形式為數據類型,比如 int的對應的指針就是int, float32對應的指針類型就是float32,依次類推;
值類型包括int,float,bool string,數組,struct;變量直接存儲,內存通常在棧中分配
引用類型包括:指針、slice切片、map、管道chan、interface等,變量存儲的是一個地址,這個地址對應的空間才真正存儲數據值,內存通常在堆上分配,沒有任何變量引用地址是,該地址對應數據空間成為垃圾,由GC(Garbage Collection)來回收。
func Zhizhen() {var num1 int = 10//&num1用于獲取存放的地址fmt.Println("num1的地址是", &num1)//1. ptr是一個指針變量;2. ptr的類型是*int;3. ptr本身的值為&num1//ptrnum1本身值為num1的地址,&獲取指針的值,*獲取指針指向的值var ptrnum1 *int = &num1fmt.Println("ptrnum1值為:", ptrnum1)fmt.Println("ptrnum1的地址為:", &ptrnum1)fmt.Println("ptrnum1指向的值為:", *ptrnum1)//直接修改num1的值*ptrnum1 = 20fmt.Println("ptrnum1指向的值為:", *ptrnum1) }4.2.9 標識符的命名規范
對各種變量,方法,函數等命名時使用的字符序列成為標識符(可以自己起名字的地方)
規則:1)由26個字母大小寫,0-9,_組成。
2)數字不可開頭 1num := 10 //false
3)Golang中嚴格區分大小寫。
4)標識符中不能包含空格
5)不能用系統保留關鍵字做標識符,比如if,break,while等等,一般不使用預定義標識符,所有如下:
保留關鍵字:
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrought | if | range | type |
| continue | for | import | return | var |
預定義標識符(包括基本數據類型和系統內嵌函數)
| complex64 | complex128 | uint16 | copy | false | float32 |
| float64 | imag | int | int8 | int16 | uint32 |
| int32 | int64 | iota | len | make | new |
| nil | panic | uint64 | println | real | |
| recover | string | true | uint | uint8 | uintprt |
6)下劃線"_"本身在Go中是一個特殊的標識符,稱為空標識符。可以代表任何其它的標識符,但是它對應的值會被忽略(比如:忽略某個返回值)。所以僅能被作為占位符使用,不能作為標識符使用。
func biaoshifu() {//_用于占位,即返回多個函數值時可以使用sum2, _ := getSumAndSub(10, 50) //只返回第二個值fmt.Println("sum2=", sum2)//可以使用int等數據結構走位變量,但是不推薦int := 10fmt.Println(int) }注意事項:1)包名:package的名字和目錄保持一直,不要使用標準庫的名字。
2)變量名,函數名,常量名采用駝峰法xxxYyyyZzzz
3)如果變量名、函數名、常量名首字母大寫,則可以被其他的包訪問;如果首字母小寫,則只能在本包中使用(注:可以簡單的理解成,首字母大寫是公開的,首字母小寫是私有的),在golang 沒有public , private等關鍵字。
4. 3運算符
運算符時一種特殊的符號,用以表示數據的運算、賦值和比較等等,主要分為六大類:
1)算術運算符 2)賦值運算符 3)比較運算符 4)邏輯運算符 5)位運算 6)其他運算符
Golang中不存在三元運算符
4.3.1 算數運算符
對數值類型的變量進行運算(加減乘除)
| + | 正數,加法,字符串相加 |
| - | 負數,減法 |
| * | 乘法 |
| / | 除法(運算都是整數,除后只保留整數部分10/4=2) |
| % | 取模 |
| ++ | 自增(+1) |
| – | 自減 |
注意:
1)除法運算時,整數相除只保留整數部分;需要保留小數部分則需要有浮點數參與運算
2)取模運算本質運算為:a%b = a - a / b * b
3)golang中的++,–只能當作單獨語言使用,不能直接賦值a := b++,也不能 i = i ++
4)++,–只能存在與變量后面,不存在++a,–a。(Golang去點c/java中容易混淆的寫法)
func yunsuanfu() {/*除法*///整數相除只保留整數部分fmt.Println(10 / 4) //輸出2//如果需要保留小數部分,則需要有浮點數參與運算fmt.Println(10.0 / 4) //輸出2.5/*取模*///標準公式為a%b = a - a / b * bfmt.Println(10 % 3)fmt.Println(-10 % 3) //= -10 - (-10) / 3 * 3 = -10 - (-9) = -1 }4.3.2 關系運算符
關系運算符的結果都是bool類型,返回值也就是要么是true,要么是false
關系表達式 經常用在if或者循環結構中。
| == | 相等于 |
| != | 不等于 |
| < | 小于 |
| > | 大于 |
| <= | 小于等于 |
| >= | 大于等于 |
注意:1)返回值只能是true或者是false
2)有關系運算符組成的表達式稱為關系表達式
3)”==“表示相等,”=“表示賦值,不能混用,需要特別注意
/*關系運算符*/fmt.Println(9 != 8) //truefmt.Println(10 <= 7) //false4.3.4 邏輯運算符
用于連接多個條件(關系表達式),最終結果也是bool
&&:邏輯與,兩邊都為真則真
||:邏輯或,有一個為真則為真
!:邏輯非,邏輯相反
注意:1)&&短路與運算中,如果第一個條件為false,則第二個條件不再判斷,最終結果為false
2)||短路或運算中,如果第二個條件為true,則第二個條件不會判斷,最終結果為true。
func test() bool {fmt.Println("查看是否輸出")return true }/*邏輯運算符*/num2 := 10if num2 < 9 && test() {fmt.Println("&&后面語句是否執行") //不輸出}if num2 > 9 && test() {fmt.Println("&&test()語句是否執行") //既輸出test()又輸出結果}if num2 > 9 || test() {fmt.Println("||后面語句是否執行") //只輸出該語句}4.3.5 賦值運算符
賦值運算符就是將某個運算后的值,付給指定的變量。
| = | 簡單賦值 | c = a + b 將a+b的值賦給c |
| += | 相加后賦值 | c += a :: c = c + a |
| -= | 相減后賦值 | c -= a : c = c - a |
| *= | 相乘后賦值 | c *= a : c = c * a |
| /= | 相除后賦值 | c/-= a : c = c / a |
| %= | 取模后賦值 | c %= a : c = c %a |
| <<= | 左移后賦值 | c <<= 2 :: c = c << 2 |
| >>= | 右移后賦值 | c >>= 2 :: c = c >> 2 |
| &= | 按位與后賦值 | c &= 2 :: c = c & 2 |
| ^= | 按位異或后賦值 | c ^= 2 :: c = c ^ 2 |
| != | 按位或后賦值 | c != 2 :: c = c ! 2 |
注意:1)運算順序從右往左:先計算,再賦值
2)賦值運算符的左邊只能是變量,右邊可以是變量,表達式,常量值
func test() int {return 90 }/*賦值運算符*/var d intd = 8 + 2 * 8d = test() + 90d = 890fmt.Println(d)不允許使用中間變量交換a和b的值,用a保存a+b,再用a+b-b獲得a的值賦給b,再做減法賦給a
//不使用中間變量交換值a := 10b := 20a = a + bb = a - ba = a - b4.3.6 位運算符
計算機進行運算時都是按照二進制補碼進行運算的:
| & | 全一為一,否則為0 |
| | | 有一為一,否則為0 |
| ^(異或) | 兩者不同(0/1)才能為一,否則為0 |
4.3.7 其他運算符
| & | 返回變量存儲地址 | &a:給出機器數的實際地址 |
| * | 指針變量 | 描述為指針 |
4.3.8運算符優先級
4.4 程序流程控制
程序運行的流程控制,決定程序是如何執行的,主要有三大流程控制語句:1)順序控制。2)分支控制。3)循環控制
4.4.1 順序控制
程序從上到下逐行執行,中間沒有任何判斷和跳轉。也是最基本的程序運行方式,按照程序從上至下的閱讀順序進行運行。
需要注意,定義變量時必須采用合法的前向引用,正確調用之前的內容。
4.4.2 分支控制
主要有三種形式:1)單分支。2)雙分支。3)多分支
4.4.2.1 單分支
golang支持再if中,直接定義一個變量
語法:/*if 條件表達式{執行代碼塊}*///單分支var age intfmt.Scanln(&age)if age >= 18 {fmt.Println("已經成年了!")}//在條件中直接賦值if age2 := 20; age2 > 20 {fmt.Println("已經不是小孩子了")}4.4.2.2 雙分支
雙分支指揮執行其中的一條分支
語法: /*if 條件表達式{ 執行代碼塊 }else{ 代碼塊 }*/var a intvar b intif a > 10 {fmt.Println("a比10大")if b < 10 {fmt.Println("b小于10")} else {fmt.Println("b大于10")}} else {fmt.Println("沒什么好說的")}4.4.3 多分支控制
4.4.3.1 一般多分支
如果條件表達式1為真,直接執行代碼1;如果1假2真,執行代碼2;以此類推,如果都不成立執行else語句【else不是必須的】。
//多分支控制if age > 0 && age <= 10 {fmt.Println("還是小孩子")} else if age > 10 && age <= 20 {fmt.Println("年輕人")} else if age > 20 && age <= 30 {fmt.Println("年輕人")} else {fmt.Println("老年人")}//案例b := trueif b == false {fmt.Println("1")} else if b {fmt.Println("2")} else if !b {fmt.Println("3")} else {fmt.Println("4")}//輸出24.4.3.2 嵌套分支
在一個分支結構中又完整的嵌套了另一個完整的分支結構,里面的分支結構稱為內層分支,外面的分支結構稱為外層分支。
嵌套分支不宜過多,建議控制在3層內。
var a intvar b intif a > 10 {fmt.Println("a比10大")if b < 10 {fmt.Println("b小于10")} else {fmt.Println("b大于10")}} else {fmt.Println("沒什么好說的")}4.4.4 switch分支控制
switch語句用于基于不同條件執行不同動作,每一個case分支都是唯一的,從上到下逐一測試,知道匹配為止。匹配項后面也不需要加break
基本語法:
switch 表達式{case 表達式1,表達式2,...:語句塊1case 表達式3,表達式4,...:語句塊2//多個casedefault:語句塊 }執行的流程及注意:
1)先執行表達式,得到值,然后和case的表達式進行比較,如果相等就匹配到,然后執行對應case的語句塊,然后退出switch控制。
2)如果case里的表達式都沒有匹配成功,則執行default的語句塊,執行后退出switch控制。
3)golang中case后的表達式可以有多個,使用逗號間隔
4)golang中的case語句塊不需要寫break,默認會有,即默認情況下執行完case語句塊后,就直接退出該switch控制結構
5)case/swich后是一個表達式(常量,變量,有返回值的函數都可)
6)default一句不是必須的,switch后面也可以不帶表達式,類似if-else語句。
7)swich穿透-fallthrough,如果在case語句后面增加fallthrough,則會繼續執行下一個case。但是指揮默認穿透一層,直接忽略掉下一層的判定條件。
var key bytefmt.Println("請選擇輸入一個字母")fmt.Scanf("%c",&key)switch key {case 'a':fmt.Println("輸入的字母是a")fallthroughcase 'b':fmt.Println("輸入的字母是b")default:fmt.Println("輸入的字母有問題")}/*輸入a,輸出"輸入的字母是a 輸入的字母是b"*/8)typeswich:還可以用于判斷某個interface變量中實際指向的變量類型。
switch和if的比較:如果判斷的具體數值不多,而且符合整數沒浮點數,字符串這些類型,建議使用switch;如果對去接判斷以及結果為bool類型的判斷,使用if。
總結
以上是生活随笔為你收集整理的Go语言学习笔记(三)---指针,运算符及流程控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android重新启动_如何重新启动An
- 下一篇: HDU 6078 Wavel Seque