指標
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
- 條件表示式沒有括號
- 支援一個初始化表示式(可以是並行方式)
- 左大括號必須和條件語句或else在同一行
- 支援單行模式
- 初始化語句中的變數為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
- Go只有for一個迴圈語句關鍵字,但支援3種形式
- 初始化和步進表示式可以是多個值
- 條件語句每次迴圈都會被重新檢查,因此不建議在條件語句中
- 使用函式,儘量提前計算好條件並以變數或常量代替
- 左大括號必須和條件語句在同一行
形式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
- 可以使用任何型別或表示式作為條件語句
- 不需要寫break,一旦條件符合自動終止
- 如希望繼續執行下一個case,需使用fallthrough語句
- 支援一個初始化表示式(可以是並行方式),右側需跟分號
- 左大括號必須和條件語句在同一行
形式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
- 三個語法都可以配合標籤使用
- 標籤名區分大小寫,若不使用會造成編譯錯誤
- Break與continue配合標籤可用於多層迴圈的跳出
- ==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