Concurrency 一次选择多个案例

Concurrency 一次选择多个案例,concurrency,go,Concurrency,Go,当同时收到C1和C2时,如何调整下面的代码以执行某些操作 导入“时间” 输入“fmt” func main(){ c1:=制造(成串) c2:=制造(成串) go func(){ 时间。睡眠(时间。秒*1) c1这可能是一个: 通过将输入通道多路复用到一个通道上,一个函数可以读取多个输入并继续执行,直到所有输入都关闭。当所有输入都关闭时,该通道将关闭。这称为扇入 func merge(cs…它必须有帮助-您想实现什么?for循环句柄同时获取两个值。@JimB我希望case msg1和msg2在

当同时收到C1和C2时,如何调整下面的代码以执行某些操作

导入“时间”
输入“fmt”
func main(){
c1:=制造(成串)
c2:=制造(成串)
go func(){
时间。睡眠(时间。秒*1)
c1这可能是一个:

通过将输入通道多路复用到一个通道上,一个函数可以读取多个输入并继续执行,直到所有输入都关闭。当所有输入都关闭时,该通道将关闭。这称为扇入


func merge(cs…它必须有帮助-您想实现什么?for循环句柄同时获取两个值。@JimB我希望case msg1和msg2在一起,而不是一个或多个值another@0xAX谢谢你似乎接近我想要的
import "time"
import "fmt"

func main() {

    c1 := make(chan string)
    c2 := make(chan string)

    go func() {
        time.Sleep(time.Second * 1)
        c1 <- "one"
    }()
    go func() {
        time.Sleep(time.Second * 2)
        c2 <- "two"
    }()

    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-c1:
            fmt.Println("received", msg1)
        case msg2 := <-c2:
            fmt.Println("received", msg2)
        }
    }
}
func merge(cs ...<-chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan string)

    // Start an output goroutine for each input channel in cs.  output
    // copies values from c to out until c is closed or it receives a value
    // from done, then output calls wg.Done.
    output := func(c <-chan string) {
        for n := range c {
            select {
            case out <- "received " + n:
            case <-done:
            }
        }
        wg.Done()
    }
    wg.Add(len(cs))
    for _, c := range cs {
        go output(c)
    }

    // Start a goroutine to close out once all the output goroutines are
    // done.  This must start after the wg.Add call.
    go func() {
        wg.Wait()
        close(out)
    }()
    return out
}