1. 程式人生 > >GO程式設計基礎之三

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")
}