go 如何 select 一组 channel

如何select 保存在切片中的channel?
比如有两个channel
一个 ch1 := make(chan []byte), 一个 ch2 := make(chan sometype)。
开始的时候可以
select {
case: msg <- ch1:

    //do something

case: msg <- ch2:

    //so something

default:

}

可是现在需要扩展多个chan sometype,个数可变的,所以将chan sometype存在切片中。这个 时候应该如何select?
谢谢。

阅读 4k
2 个回答

给个思路参考下:将多个 channel 合并成一个,像这样

package main

import (
    "fmt"
    "sync"
)

// 合并多个 channel
func join_chan(cs []chan int) chan int {
    var wg sync.WaitGroup
    js := make(chan int, len(cs))
    for i := 0; i < len(cs); i++ {
        wg.Add(1)
        go func(index int) {
            for n := range cs[index] {
                js <- n
            }
            wg.Done()
        }(i)
    }

    // 当所有输入 channel 关闭时,自动关闭输出 channel
    go func() {
        wg.Wait()
        close(js)
    }()

    return js
}

func main() {
    cs := make([]chan int, 10)
    for i := 0; i < len(cs); i++ {
        cs[i] = make(chan int, 10)
    }

    sum := join_chan(cs)
    go func() {
        for i := 0; i < len(cs); i++ {
            cs[i] <- i
            close(cs[i])
        }
    }()

    for n := range sum {
        fmt.Printf("%d\n", n)
    }
}
新手上路,请多包涵

我在网上找到一个用反射来做的select。感觉还不错,就是不知道效率如何

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题