1.遞增遞減語句
在Go當中,++ 與 – 是作爲語句而並不是作爲表達式
func main() {
a := 1 //a++不能放在=號右面
a++ //不可以寫成++a
var p *int = &a
fmt.Println(*p) //2
}
2.判斷語句if
- 條件表達式沒有括號
- 支持一個初始化表達式(可以是並行方式)
- 左大括號必須和條件語句或else在同一行
- 支持單行模式
- 初始化語句中的變量爲block級別,同時隱藏外部同名變量
func main() {
a := 10;
if a:=1; a < 5{
fmt.Println(a) //1 此時取if語句定義的a,全局的同名變量a將被隱藏
}
fmt.Println(a) //10
}
3.循環語句for
- Go只有for一個循環語句關鍵字,但支持3種形式
- 初始化和步進表達式可以是多個值
- 條件語句每次循環都會被重新檢查,因此不建議在條件語句中使用函數,儘量提前計算好條件並以變量或常量代替
- 左大括號必須和條件語句在同一行
func main(){
a := 1
for {
a++
if a > 3{
break
}
}
fmt.Println(a) //4
}
func main(){
a := 1
for a <= 3 {
a++
}
fmt.Println(a) //4
}
func main(){
a := 1
for i := 0; i < 3; i++{
a++
}
fmt.Println(a) //4
}
4.選擇語句switch
- 可以使用任何類型或表達式作爲條件語句
- 不需要寫break,一旦條件符合自動終止
- 如希望繼續執行下一個case,需使用fallthrough語句
- 支持一個初始化表達式(可以是並行方式),右側需跟分號
- 左大括號必須和條件語句在同一行
func main(){
a := 1
switch a {
case 0:
fmt.Println("a=0")
case 1:
fmt.Println("a=1") //打印出來
}
fmt.Println(a) //1
}
func main(){
a := 1
switch {
case a >= 0:
fmt.Println("ok") //ok
fallthrough
case a >= 1:
fmt.Println("ok") //ok
}
fmt.Println(a) //1
}
func main(){
switch a:=1;{
case a >= 0:
fmt.Println("ok") //ok
fallthrough
case a >= 1:
fmt.Println("ok") //ok
}
//fmt.Println(a) //編譯出錯 undefined: a
}
5.跳轉語句goto, break, continue
下面的示例中包含了嵌套的循環體,break 只會退出最內層的循環:
package main
func main() {
for i:=0; i<3; i++ {
for j:=0; j<10; j++ {
if j>5 {
break
}
print(j)
}
print(" ")
}
}
輸出:
012345 012345 012345
關鍵字 continue 忽略剩餘的循環體而直接進入下一次循環的過程,但不是無條件執行下一次循環,執行之前依舊需要滿足循環的判斷條件。
package main
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
print(i)
print(" ")
}
}
輸出:
0 1 2 3 4 6 7 8 9
顯然,5 被跳過了。
另外,關鍵字 continue 只能被用於 for 循環中。
goto語句可以無條件地轉移到過程中指定的行。 通常與條件語句配合使用。可用來實現條件轉移, 構成循環,跳出循環體等功能。
在結構化程序設計中一般不主張使用goto語句, 以免造成程序流程的混亂
goto對應(標籤)既可以定義在for循環前面,也可以定義在for循環後面,當跳轉到標籤地方時,繼續執行標籤下面的代碼。
func main() {
// 放在for前面,此例會一直循環下去
Loop:
fmt.Println("test")
for a:=0;a<5;a++{
fmt.Println(a)
if a>3{
goto Loop
}
}
}
func main() {
for a:=0;a<5;a++{
fmt.Println(a)
if a>3{
goto Loop
}
}
Loop: //放在for後邊
fmt.Println("test")
}
- 三個語法都可以配合標籤使用
- 標籤名區分大小寫,若不使用會造成編譯錯誤
- Break與continue配合標籤可用於多層循環的跳出
- Goto是調整執行位置,與其它2個語句配合標籤的結果並不相同
func main(){
LABEL:
for {
for i := 0; i < 10; i++{
if i > 2 {
break LABEL
}else{
fmt.Println(i)
}
}
}
}
//打印出0 1 2
func main(){
LABEL:
for i := 0; i < 10; i++{
for {
fmt.Println(i)
continue LABEL
}
}
}