为了账号安全,请及时绑定邮箱和手机立即绑定

跳出选择循环?

跳出选择循环?

Go
皈依舞 2021-08-10 17:11:57
我正在尝试使用select循环来接收消息或超时信号。如果收到超时信号,循环应该中止:package mainimport ("fmt"; "time")func main() {    done := time.After(1*time.Millisecond)    numbers := make(chan int)    go func() {for n:=0;; {numbers <- n; n++}}()    for {        select {            case <-done:                break            case num := <- numbers:                fmt.Println(num)        }    }}然而,它似乎并没有停止:$ go run a.go01234567891011121314151617181920212223242526272829303132[...]38243825[...]为什么?我用time.After错了吗?
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

Go规范说

“break”语句终止同一函数内最里面的“for”、“switch”或“select”语句的执行。

在您的示例中,您只是脱离了 select 语句。如果您替换break为一条return语句,您将看到它正在运行。


查看完整回答
反对 回复 2021-08-10
?
SMILET

TA贡献1796条经验 获得超4个赞

在您的示例代码中, areturn似乎像 Pat 所说的那样合适,但为了将来参考,您可以使用标签:


package main


import (

    "fmt"

    "time"

)


func main() {

    done := time.After(1 * time.Millisecond)

    numbers := make(chan int)


    // Send to channel

    go func() {

        for n := 0; ; {

            numbers <- n

            n++

        }

    }()


readChannel:

    for {

        select {

        case <-done:

            break readChannel

        case num := <-numbers:

            fmt.Println(num)

        }

    }


    // Additional logic...

    fmt.Println("Howdy")

}


查看完整回答
反对 回复 2021-08-10
  • 3 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信