GO程式設計基礎之三
1.指標:
GO雖然保留了指標,但與其他程式語言不同的是,在GO當中不支援指標運算以及"->"運算子,而直接採用"."選擇符來操作指標目標物件的成員
--操作符"&"取變數地址,使用"*"通過指標間接訪問目標物件
--預設值為nil而非NULL
func main(){ a := 1 //int型變數a var P *int = &a //指向int的指標P fmt.Println(P); //輸出P所指向的記憶體地址
fmt.Println(P*); //輸出P指標指向地址的值}
2.遞增遞減語句:
在GO當中,++與--是作為語句並不是作為表示式;
表示式是可以放在等號右邊的;比如:a := a++ 這樣在GO語句是不被允許的;
語句只能作為單獨的一行;
func main(){ a := 1 a++ var P *int = &a fmt.Println(*P); }
3.判斷語句IF:
---條件表示式沒有括號;
---支援一個初始化表示式(可以是並行方式);
func main(){
a := 1 if a :=1;a > 1{ //初始化變數a是一個區域性變數,等if語句塊全部執行完後變數a就不存在了 fmt.Println(a); } fmt.Println(a); //如果外部也定義一個變數a,這個時候外部的變數a在if語句塊中就會被暫時隱藏起來,整個if語句中都只會用初始化的變數a }
---左大括號必須和if語句或else放在同一行;
---支援單行模式
---初始化語句中的變數為block級別,同事隱藏外部同名變數
4.迴圈語句for
---Go只有for一個迴圈語句關鍵字,但支援3中形式;
(1)無限迴圈:只有一個for迴圈,必須在迴圈中判斷條件並退出迴圈
func main(){ a := 1 for { a++ if a>3 { break } fmt.Println(a) //輸出2,3,over }fmt.Println("Over"); }
(2)for語句自己帶有一個條件表示式
func main(){ a := 1 for a <= 3{ a++ fmt.Println(a) } fmt.Println("Over"); //輸出2,3,4,over }(3)for迴圈包含:計數器的初始化,條件判斷語句和步進表示式
func main(){ a := 1 for i :=0;i < 3;i++{ a++ fmt.Println(a) } fmt.Println("Over"); }
---初始化和步進表示式可以是多個值;
---條件語句每次迴圈都會被重新檢查,因此不建議在條件語句中使用函式,儘量提前計算好條件並以變數或常量代替
func main(){ a := "string"
l := len(a)
for i :=0;i < len(a);i++{ //for迴圈每次都會執行len函式,降低了程式執行效率不如把len函式放在for迴圈之外 fmt.Println(a) } fmt.Println("Over"); }
---左大括號必須和條件語句在同一行
5.選擇語句switch:
---可以使用任何型別或表達作為條件語句;
---不需要寫break,一旦條件符合自動終止;
---如希望繼續執行下一個case,需要使用fallthrough語句;
---支援一個初始化表示式(可以是並行方式),右側需跟分號
---左大括號必須和條件語句在同一行;
(1)一般形式,switch後加條件表示式:
func main(){ a := 1 switch a { case 0: fmt.Println("a=0") case 1: fmt.Println("a=1") default: fmt.Println("None") } }
(2)case後加條件表示式:
func main(){ a := 1 switch { case a >= 0: //滿足條件就跳出了,不繼續下一個case fmt.Println("a>=0")
fallthrought //即使第一個case符合條件,還是會繼續檢查下一個case case a >= 1: fmt.Println("a>=1") default: fmt.Println("None") } }
(3)switch後加初始化語句:初始化變數a的作用域範圍在switch語句塊中,是區域性變數;
func main(){ switch a := 1; { case a >= 0: fmt.Println("a=0") case a >= 1: fmt.Println("a=1") default: fmt.Println("None") } fmt.Println(a) }
6.跳轉語句:goto,break,continue
---三個語法都可以配合標籤使用;
---標籤名區分大小寫,若不使用會造成編譯錯誤;
---Break與continue配合標籤可用於多層迴圈的跳出;
---Goto是調整執行位置,與其他2語句配合標籤的結果並不相同;
(1)原來的break只能跳出一層迴圈:只能跳出第一個for有限迴圈,但是跳不出最上層的for無限迴圈;
func main(){ LABEL1: for{ for i := 0;i < 10;i++{ if i > 3{ break } } } }
(2)使用標籤後,break可以跳出到和LABEL1同一級的迴圈層:
func main(){ LABEL1: for{ for i := 0;i < 10;i++{ if i > 3{ break LABEL1 //如果將這裡的break改成goto,程式就會又跳到LABEL1繼續執行,容易造成死迴圈 } } }
fmt.Println("OK") }
(3)使用goto,儘量把goto放到,標籤之前;
func main(){ for{ for i := 0;i < 10;i++{ if i > 3{ goto LABEL1 } } } LABEL1: fmt.Println("OK") }
(4)continue:
func main(){ LABEL1: for i := 0;i < 10; i++{ for{ continue LABEL1 fmt.Println(i) //內部的無限迴圈語句永遠不會被執行,因為continue直接跳到外部的有限迴圈語句執行了 } } fmt.Println("OK") }