Go语言中为啥要保留goto?

世界上最好的语言-PHP的开发团队经过缜密的思考在他们更新的的5.3大版本就是重新引入了goto语句。所以go也当然要保留goto
■网友
实际上你在linux内核的代码里也会经常看到使用goto的情形。goto在Go语言相比c有更严格的限制:https://golang.org/ref/spec#Goto_statements这是math/gamma.go里的代码片段:for x \u0026lt; 0 { if x \u0026gt; -1e-09 { goto small } z = z / x x = x + 1 } for x \u0026lt; 2 { if x \u0026lt; 1e-09 { goto small } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP+_gamP)*x+_gamP)*x+_gamP)*x+_gamP)*x+_gamP)*x + _gamP q = ((((((x*_gamQ+_gamQ)*x+_gamQ)*x+_gamQ)*x+_gamQ)*x+_gamQ)*x+_gamQ)*x + _gamQ return z * p / qsmall: if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x)}上面的代码控制流,在一个块内使用goto进行跳转,有更好的可读性,写法更简单流畅。所以goto有害不等于goto就一无是处。If you need to go to somewhere, goto is the way to go. —— Ken
■网友
goto本来就是有合理的用法的。
在提倡结构化设计以前,goto的用法太过不受限制,所以那个时候提倡不用goto也不能说错。
现在大家都明白goto的危害了,乱用goto会被团队的人嘲笑,这种时候,goto反而没有什么危害了,它的用处反而超过了它的害处。
条条框框的东西不一定对,但是你在搞运动的时候又免不了一刀切。
等风头过去了,该干嘛干嘛。

■网友
刚刚遇到一个,写完这段代码把我恶心坏了。
1 我造个带缓冲通道就是要累积一段时间然后集中处理,往chan塞消息简单,但是怎么集中读出来,暂没找到一次性把所有缓存消息都读出来的方法。只好用这种select
2 select吧,case默认就是c那种break的啦,想穿透就显式写falltrough,很好。可是这case仍支持break语句,把我这个初学者坑的没退出for循环。对fallthrough支持同时竟然没互斥干掉对break的支持。学艺不精学艺不精
【Go语言中为啥要保留goto?】 这里用goto到后面的标签,或者给for一个标签,然后break后写这个for的标签,再或者就是下面这个引入辅助变量。
// 消息列表ch = make(chan Msg, 255)// 定时从ch中取出所有数据shouldbreak := falsefor { select { case msg := \u0026lt;- ch: // some actions case \u0026lt;-time.After(time.Second): // timed out shouldbreak = true break } if shouldbreak { break }}// continue...// 上面哪个shouldbreak恶心吧,为何不直接goto到这里呢?
■网友
On Error Goto xx好吧,这不是Go
■网友
因为好用啊


    推荐阅读