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

go - 如何使用 golang goroutine、select 和 if 语句返回?

go - 如何使用 golang goroutine、select 和 if 语句返回?

Go
慕莱坞森 2022-01-04 13:30:59
我试图在 goroutine 中做一个“if”语句。问题:如何从 10 变成 10?var jr = make(chan int, 10)var clients = 10 // The number of clients varies with time.func rpcMethod(num int) {    time.Sleep(time.Duration(rand.Intn(int(time.Second))))    jr <- num}func postHandler(num int) {    // wait RPC data    for {        select {        case msg := <-jr:            {                if msg == num {                    fmt.Println(num, "hello from", msg)                    return                }            }        }    }}func main() {    for i := 0; i < clients; i++ {        go postHandler(i)        go rpcMethod(i)    }    fmt.Scanln()}结果 2/105 你好来自 52 你好来自 2
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

好的,有很多问题。


首先,它不起作用,因为当从通道读取某些内容时,它会消失(它不是广播,只有一个线程可以读取消息)。


因此,为了让您的代码伪工作,您可以这样做:


 if msg == num {

      fmt.Println(num, "hello from", msg)

      return

 }else {

      // not my number, put it back in the channel

      jr <- num

 }

您将获得预期的结果,但仍然存在一个问题:您的程序无法正常关闭。我想这仅用于实验/学习目的,但在实际程序中,您将使用完全不同的代码。告诉我你是否对另一个版本感兴趣。


查看完整回答
反对 回复 2022-01-04
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

之后postHandler接收msg来自通道jr,该值是不是在通道再另外postHandler找。频道不广播。

无论是送价值回到通道,如果它不等于num或重组完全是你的代码。


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

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