首页
学习
活动
专区
圈层
工具
发布

EN

Stack Overflow用户
提问于 2016-04-13 12:44:48
回答 2查看 2.1K关注 0票数 0

我正试着在戈鲁廷做一个“如果”的声明。问:如何从10中得到10?

代码语言:javascript
复制
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/10

  • 5点打个招呼
  • 2你好,从2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-13 13:03:53

好的,有很多问题。

首先也是最重要的是,它不能工作,因为当从一个通道读取某物时,它就消失了(它不是一个广播,只有一个线程可以读取消息)。

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

代码语言:javascript
复制
 if msg == num {
      fmt.Println(num, "hello from", msg)
      return
 }else {
      // not my number, put it back in the channel
      jr <- num
 }

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

票数 1
EN

Stack Overflow用户

发布于 2016-04-13 13:01:41

postHandler从通道jr接收到msg后,该值不再在通道中供另一个postHandler查找。频道不广播。

如果它不等于将值发送回通道,或者完全重构您的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36598819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档