网站建设 如何友情链接,sh域名做的好的网站,网络推广外包哪家好,免费ppt模板的软件break语句常用来中断循环。当循环与switch或select一起使用时#xff0c;开发者经常执行了错误的break语句。 让我们来看下面的示例。我们在for循环里使用了switch,如果循环索引值是2#xff0c;那么我们想中断循环#xff1a;
package mainimport (fmt
)func … break语句常用来中断循环。当循环与switch或select一起使用时开发者经常执行了错误的break语句。 让我们来看下面的示例。我们在for循环里使用了switch,如果循环索引值是2那么我们想中断循环
package mainimport (fmt
)func main() {for i : 0; i 5; i {fmt.Printf(%d , i)switch i {default:case 2:break}}
} 这段代码乍一看没什么问题然而它不像我们想象的那样运作。break语句没有中断for循环而是中断了switch语句。因此这段代码从0迭代到4:0 1 2 3 4,而不是从0 迭代到2。 要记住的一个基本规则是break语句终止最里面的for、switch或select语句在上面的例子中它中断的是switch语句。
那如何跳出循环而不是switch语句呢最常用的方式是使用标签
package mainimport (fmt
)func main() {
loop:for i : 0; i 5; i {fmt.Printf(%d , i)switch i {default:case 2:break loop}}
}这里我们将loop标签与for循环关联起来。然后由于我们给break语句提供了loop标签它跳出了循环而不是switch语句因此这个正如我们期望的打印0 1 2。
带标签的break和goto一样吗 一些开发者可能会质疑使用带标签的break是否是习惯用法并把它当作花哨的goto语句然而事实并非如此这样的代码也在标准库中被使用。比如在net/http包中从一个缓冲区中按行读取
readlines:for {line,err : rw.Body.ReadString(\n)switch {case err io.EOF:break readlinescase err ! nil:t.Fatalf(unexpected error reading from CGI: %v,err)}//...}
这个例子使用了简明的readlibes标签来强调循环的目标。因此我们应该认为在Go中使用标签中断语句是一个习惯用法。 break 语句也可能错误地出现在循环内的select语句中。在下面这段代码中我们想用带有两个case的select语句在上下文被取消时退出循环
for {select {case -ch://做具体操作case -ctx.Done():break //如果上下文被取消则中断执行}
}
这里最里面的for、switch或select语句是select语句而不是for循环。所以循环仍重复进行。同样地我们可以使用标签中断循环
loop: //定义循环标签
for {select {case -ch://做具体操作case -ctx.Done():break loop //终止loop标签关联的循环而不是select}
}
现在和预期一致break语句跳出了循环而不是跳出select 语句。 在循环中使用switch或select时要保持谨慎。当使用break时应始终确保我们知道哪个语句会受影响正如我们看到的使用标签强制退出特定语句是惯用的解决方案。