猿问

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

我试图在 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


慕莱坞森
浏览 163回答 2
2回答

慕的地6264312

好的,有很多问题。首先,它不起作用,因为当从通道读取某些内容时,它会消失(它不是广播,只有一个线程可以读取消息)。因此,为了让您的代码伪工作,您可以这样做:&nbsp;if msg == num {&nbsp; &nbsp; &nbsp; fmt.Println(num, "hello from", msg)&nbsp; &nbsp; &nbsp; return&nbsp;}else {&nbsp; &nbsp; &nbsp; // not my number, put it back in the channel&nbsp; &nbsp; &nbsp; jr <- num&nbsp;}您将获得预期的结果,但仍然存在一个问题:您的程序无法正常关闭。我想这仅用于实验/学习目的,但在实际程序中,您将使用完全不同的代码。告诉我你是否对另一个版本感兴趣。

海绵宝宝撒

之后postHandler接收msg来自通道jr,该值是不是在通道再另外postHandler找。频道不广播。无论是送价值回到通道,如果它不等于num或重组完全是你的代码。
随时随地看视频慕课网APP

相关分类

Go
我要回答