与其他语言一样,Go语言也支持label(标签)语法:分别是break label和 goto label
这样使得编程时变得异常灵活,但是由于在大项目中不好控制,所以建议能不使用goto label就不要使用
break label 和 goto label都能在循环中跳出循环,但是又有些不同之处。
首先说下break label,break的跳转标签(label)必须放在循环语句for前面,并且在break label跳出循环不再执行for循环里的代码。
break label
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
c1 := make(chan int, 10)
c2 := make(chan string, 5)
for i := 0; i < 10; i++ {
rand.Seed(time.Now().UnixNano())
c1 <- rand.Intn(100)
}
c2 <- "commerce"
c2 <- "corresponding"
c2 <- "oblige"
c2 <- "decline"
c2 <- "praise"
label1:
for {
select {
case v := <-c1:
fmt.Println(v)
case v := <-c2:
fmt.Println(v)
default:
fmt.Println("两个管道都没数据了吧")
break label1
}
}
fmt.Println("adhere")
}
goto label
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
c1 := make(chan int, 10)
c2 := make(chan string, 5)
for i := 0; i < 10; i++ {
rand.Seed(time.Now().UnixNano())
c1 <- rand.Intn(100)
}
c2 <- "commerce"
c2 <- "corresponding"
c2 <- "oblige"
c2 <- "decline"
c2 <- "praise"
for {
select {
case v := <-c1:
fmt.Println(v)
case v := <-c2:
fmt.Println(v)
default:
fmt.Println("两个管道都没数据了吧")
goto label1
}
}
label1:
fmt.Println("adhere")
}
break 的label只能放在循环之前,而goto的label可以放在循环之前也可以放在循环之后。