go--for 循環(huán)、continue、break、goto
for 循環(huán)
go 里面的循環(huán)只有一個 for 循環(huán)
for 循環(huán)有下面四種方式的寫法
第一種方式,for 后面什么都不寫
死循環(huán),在代碼中,如果一個 for 循環(huán)沒有結束條件,則代碼會陷入死循環(huán)
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("開始")
for { // 死循環(huán)了,沒有結束條件
fmt.Println("紅鯉魚與綠鯉魚與驢")
time.Sleep(time.Second * 1) // 等一秒再繼續(xù)執(zhí)行
}
}
第二種,只寫判斷條件
package main
import (
"fmt"
)
func main() {
fmt.Println("開始")
number := 1
for number < 5 { // 只寫了判斷條件
fmt.Println("釣魚要掉刀魚,刀魚要到島上釣")
number = number + 1
}
fmt.Println("結束")
}
package main
import (
"fmt"
)
func main() {
fmt.Println("開始")
flag := true
for flag {
fmt.Println("釣魚要掉刀魚,刀魚要到島上釣")
flag = false // 設為 false,就會結束,不在循環(huán)
}
fmt.Println("結束")
}
第三種,變量&條件
package main
import (
"fmt"
)
func main() {
fmt.Println("開始")
for i := 1; i < 10; { // 變量 i 只在 for 循環(huán)內有效,條件為 i<10
fmt.Println("釣魚要掉刀魚,刀魚要到島上釣")
i = i + 1 // i 會加 1
}
fmt.Println("結束")
}
第四種,變量&條件&變量賦值
package main
import (
"fmt"
)
func main() {
fmt.Println("開始")
for i := 1; i < 10; i = i + 1 { //變量+條件+條件賦值
fmt.Println("釣魚要掉刀魚,刀魚要到島上釣")
}
// i = i + 1 簡化為:i++
for i := 1; i < 10; i++ {
fmt.Println("釣魚要掉刀魚,刀魚要到島上釣")
}
fmt.Println("結束")
}
上面四種就是 for 循環(huán)的四種寫法,最常用的是第四種
for range
在 go 中,我們可以通過 for range 來循環(huán),會返回兩個值,第一個是索引,第二個是值
package main
import (
"fmt"
)
func main() {
str1 := "hello鄒鄒"
for _, value := range str1 {
fmt.Println(value)
}
}
結果
104
101
108
108
111
37049
37049
上面代碼執(zhí)行后,會打印一串數字而不是字符。這是由于go語言中的字符串實際上是類型為 byte 的只讀切片?;蛘哒f一個字符串就是一堆字節(jié)。這意味著,當我們將字符存儲在字符串中時,實際存儲的是這個字符的字節(jié)。一個字符串包含了任意個 byte,它并不限定 Unicode,UTF-8 或者任何其他預定義的編碼。
我們可以用 string 轉換一下
package main
import (
"fmt"
)
func main() {
str1 := "hello鄒鄒"
for index, value := range str1 {
fmt.Println(index, string(value))
}
}
結果
0 h
1 e
2 l
3 l
4 o
5 鄒
8 鄒
但上面我們輸出的索引是有問題的,所以我們可以轉為 rune 的列表,在循環(huán),如下
package main
import (
"fmt"
)
func main() {
str1 := "hello鄒鄒"
//轉成 rune 的列表
for index, value := range []rune(str1) {
fmt.Println(index, string(value))
}
}
結果
0 h
1 e
2 l
3 l
4 o
5 鄒
6 鄒
continue
在 for 循環(huán)中,當循環(huán)遇到 continue 關鍵字時,會停止當前循環(huán),開始下一次循環(huán)
案例1:使用循環(huán)輸出 1 2 3 4 5 6 8 9 10,即:10以內除7以外的整數。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
if i == 7 {
continue
}
fmt.Println(i)
}
}
結果
1
2
3
4
5
6
8
9
10
案例2:for循環(huán)嵌套 + continue
package main
import (
"fmt"
)
func main() {
for i := 1; i < 3; i++ {
for j := 1; j < 5; j++ {
if j == 3 {
continue
}
fmt.Println(i, j)
}
}
}
結果
1 1
1 2
1 4
2 1
2 2
2 4
break
在 for 循環(huán)中時,循環(huán)中一旦遇到 break,跳出循環(huán)
package main
import "fmt"
func main() {
fmt.Print("開始")
data := 66
for {
var userInputNumber int
fmt.Print("請輸入數字:")
fmt.Scanln(&userInputNumber)
if userInputNumber > data {
fmt.Println("大了")
} else if userInputNumber < data {
fmt.Println("小了")
} else {
fmt.Println("恭喜你猜對了")
break
}
}
fmt.Print("結束")
}
案例:
package main
import "fmt"
func main() {
for i := 1; i < 3; i++ {
for j := 1; j < 5; j++ {
if j == 3 {
break
}
fmt.Println(i, j)
}
}
}
結果
1 1
1 2
2 1
2 2
給 for 進行打標簽
在 go 種,可以對 for 進行打標簽,然后通過 break 和 continue 就可以實現多層循環(huán)的跳出和終止
package main
import "fmt"
func main() {
f1: // 給 for 打了個標簽,f1
for i := 1; i < 3; i++ {
for j := 1; j < 5; j++ {
if j == 3 {
continue f1 // continue 后面加了 f1,則會跳出打了標簽的 for 循環(huán)
}
fmt.Println(i, j)
}
}
}
結果
1 1
1 2
2 1
2 2
例子
package main
import "fmt"
func main() {
f1: // 給 for 打了個標簽,f1
for i := 1; i < 3; i++ {
for j := 1; j < 5; j++ {
if j == 3 {
break f1 // break 后面加了 f1,則會跳出打了標簽的 for 循環(huán)
}
fmt.Println(i, j)
}
}
}
結果
1 1
1 2
goto 語句
go 語言中的 goto 語句可以無條件的轉移到過程中指定的行。
goto 語句通常與條件語句配合使用,可以用來實現條件轉移,構成循環(huán),跳出循環(huán)體等功能。但是,在結構化程序設計中一般不主張使用 goto 語句,以免造成程序流程的混亂,使理解和調試程序都產生困難
package main
import "fmt"
func main() {
var name string
fmt.Print("請輸入姓名:")
fmt.Scanln(&name)
if name == "鄒鄒" {
// svip
goto SVIP // 直接從 SVIP 處往下執(zhí)行代碼
} else if name == "張三" {
// vip
goto VIP // 直接從 VIP 處往下執(zhí)行代碼
}
fmt.Println("預約...")
VIP: // 給個標記為 VIP
fmt.Println("等號...")
SVIP: // 給個標記為 SVIP
fmt.Println("進入...")
}



我們可以使用 goto 語句來處理錯誤,例如如下的錯誤
err := firstCheckError() // 第一個錯誤
if err != nil{
exitProcess()
return
}
err := secondCheckError() // 第二個錯誤
if err != nil{
exitProcess()
return
}
fmt.Println("done")
我們可以使用 goto 語句來處理
err := firstCheckError() // 第一個錯誤
if err != nil{
goto onExit // 跳轉到 onExit
}
err := secondCheckError() // 第二個錯誤
if err != nil{
goto onExit // 跳轉到 onExit
}
fmt.Println("done")
onExit: // 跳轉到這里執(zhí)行
exitProcess()

浙公網安備 33010602011771號