Go: break label与goto label的区别

与其他语言一样,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可以放在循环之前也可以放在循环之后。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值