Go 基礎教程--5 控制語句

CR發表於2019-09-16

指標

​ Go雖然保留了指標,但與其它程式語言不同的是,在Go當中不
支援指標運算以及”->”運算子,而直接採用”.”選擇符來操作指標
目標物件的成員

運算子”&”取變數地址,使用”*”透過指標間接訪問目標物件
預設值為 nil 而非 NULL

示例1:

package main

import "fmt"
func main() {
    a := 1
    var p *int = &a
    fmt.Println(p)
    fmt.Println(*p)
}
//0xc00004e058
//1

遞增遞減語句

​ 在Go當中,++ 與 – 是作為語句而並不是作為表示式

package main

import "fmt"
func main() {
    //錯誤做法 a := a++
    a := 1
    a++
    var p *int = &a
    fmt.Println(*p)
}

判斷語句if

  1. 條件表示式沒有括號
  2. 支援一個初始化表示式(可以是並行方式)
  3. 左大括號必須和條件語句或else在同一行
  4. 支援單行模式
  5. 初始化語句中的變數為block級別,同時隱藏外部同名變數
    1.0.3版本中的編譯器BUG

示例1:

package main
import "fmt"
func main() {
    a : = 1
    if a := 1; a> 1 {

    }
    fmt.Println(a)
}
1. if後面沒有括號
2.if外定義了之後,if中再定義,預設使用if中定義的

示範2:

package main
import "fmt"
func main() {
    a := 10
    if a := 1; a> 0 {
        fmt.Println(a)
    }
    fmt.Println(a)
}
//1
//10

迴圈語句for

  1. Go只有for一個迴圈語句關鍵字,但支援3種形式
  2. 初始化和步進表示式可以是多個值
  3. 條件語句每次迴圈都會被重新檢查,因此不建議在條件語句中
  4. 使用函式,儘量提前計算好條件並以變數或常量代替
  5. 左大括號必須和條件語句在同一行

形式1:

package main
import "fmt"
func main() {
    a :=1
    for{
        a++
        if a>3 {
            break
        }
        fmt.Println(a)
    }
    fmt.Println(over)
}
//2
//3
//over

形式2:

package main
import "fmt"
func main() {
    a :=1
    for a <= 3 {
        a++
        fmt.Println(a)
    }
    fmt.Println(a)
}

//2
//3
//4
//4

形式3:

package main
import "fmt"
func main() {
    a :=1
    for i := 0; i <3; i++ {
        a++
        fmt.Println(a)
    }
    fmt.Println(a)
}
//2
//3
//4
//4

選擇語句switch

  1. 可以使用任何型別或表示式作為條件語句
  2. 不需要寫break,一旦條件符合自動終止
  3. 如希望繼續執行下一個case,需使用fallthrough語句
  4. 支援一個初始化表示式(可以是並行方式),右側需跟分號
  5. 左大括號必須和條件語句在同一行

形式1:

package main

import "fmt"
func main() {
    a := 1
    switch a {
    case 0:
        fmt.Println("a=0")
    case 1:
        fmt.Println("a=1")
    default:
        fmt.Println("None")
    }
}

形式2:

package main
import "fmt"
func main() {
    a := 1
    switch {
    case a >= 0:
        fmt.Println("a>=0")
        //fallthrough
    case a >= 1:
        fmt.Println("a>=1")
    default:
        fmt.Println("None")
    }
}
// a>= 0
加上fallthrough
// a>= 0
// a>= 1

作用域問題:

package main
import "fmt"
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("None")
}
//undefined: a 未定義
存在作用域的問題,所以最好放在switch外面

跳轉語句goto, break, continue

  1. 三個語法都可以配合標籤使用
  2. 標籤名區分大小寫,若不使用會造成編譯錯誤
  3. Break與continue配合標籤可用於多層迴圈的跳出
  4. ==Goto是調整執行位置==,與其它2個語句配合標籤的結果並不相同

示例1:

package main

import (
    "fmt"
)

func main() {
LABEL1:
    for {
        for i := 0; i< 10; i++ {
            if i > 3 {
                break LABEL1
            }
        }
    }
    fmt.Println("ok")
}
//ok

示例2:

package main

import (
    "fmt"
)

func main() {
//死迴圈
//LABEL1:
//    for {
//        for i := 0; i< 10; i++ {
//            if i > 3 {
//                goto LABEL1
//            }
//        }
//    }
//    fmt.Println("ok")

    for {
        for i := 0; i< 10; i++ {
            if i > 3 {
                break LABEL1
            }
        }
    }
LABEL1:
    fmt.Println("ok")
}
//報錯
//.\temp7.go:33:11: break label not defined: LABEL1
//.\temp7.go:37:1: label LABEL1 defined and not used

continue停止當前迴圈,進入下一次迴圈

package main
import (
    "fmt"
)

func main() {
LABEL1:
        for i := 0; i< 10; i++ {
            for {
                continue LABEL1
                fmt.Println(i)
            }
        }
    fmt.Println("ok")
}
//ok

作業:

將下面的continue替換成goto,程式執行的結果還一樣嗎?

package main
import "fmt"
func main() {
LABEL1:
        for i := 0; i< 10; i++ {
            for {
                fmt.Println(i)
                continue LABEL1
            }
        }
    fmt.Println("ok")
}
0
1
2
3
4
5
6
7
8
9
ok
//continue改成goto,會一直是0
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章