在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ go 如何 select 一組 channel

go 如何 select 一組 channel

如何select 保存在切片中的channel?
比如有兩個(gè)channel
一個(gè) ch1 := make(chan []byte), 一個(gè) ch2 := make(chan sometype)。
開始的時(shí)候可以
select {
case: msg <- ch1:

    //do something

case: msg <- ch2:

    //so something

default:

}

可是現(xiàn)在需要擴(kuò)展多個(gè)chan sometype,個(gè)數(shù)可變的,所以將chan sometype存在切片中。這個(gè) 時(shí)候應(yīng)該如何select?
謝謝。

回答
編輯回答
別硬撐

我在網(wǎng)上找到一個(gè)用反射來做的select。感覺還不錯(cuò),就是不知道效率如何

2018年8月28日 01:32
編輯回答
尛曖昧

給個(gè)思路參考下:將多個(gè) channel 合并成一個(gè),像這樣

package main

import (
    "fmt"
    "sync"
)

// 合并多個(gè) 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)
    }

    // 當(dāng)所有輸入 channel 關(guān)閉時(shí),自動(dòng)關(guān)閉輸出 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)
    }
}
2018年4月22日 19:49