【问题标题】:go - How to use golang goroutine, select and if statement to return?go - 如何使用 golang goroutine、select 和 if 语句返回?
【发布时间】:2016-08-04 13:46:25
【问题描述】:

我正在尝试在 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/10

  • 5 你好,来自 5
  • 2 来自 2 的问候

【问题讨论】:

  • 也许我做错了什么?我尝试在 Post 请求中传输数据 A1,并将它们处理给第三方服务,其答案将以 A2、B2 的形式出现。然后我比较 == A1 A2 并写在 Post B2 中。

标签: if-statement select go return goroutine


【解决方案1】:

好的,有多个问题。

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

所以为了让你的代码伪工作,你可以这样做:

 if msg == num {
      fmt.Println(num, "hello from", msg)
      return
 }else {
      // not my number, put it back in the channel
      jr <- num
 }

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

【讨论】:

  • 有趣的是另一个版本。
【解决方案2】:

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

send the value back into the channel 不等于 num 或完全重构您的代码。

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 2015-08-05
    • 2012-08-23
    • 1970-01-01
    • 2020-08-20
    • 2013-07-22
    • 2021-03-13
    • 2016-01-24
    • 2013-09-09
    相关资源
    最近更新 更多