动态创建通道以用作Go中可变参数函数的参数

时间:2017-06-28 22:36:15

标签: go variadic-functions

是否可以在Go中动态创建频道,然后为其分配值?这个扇出扇形代码与

一起使用
position: absolute

但我想做一些像

这样的事情
f1 := factorial(in)
f2 := factorial(in)
for n := range merge(f1, f2) { 
        fmt.Println(n)
}

这会出现以下错误

var res [2]<-chan int
res[0] = make(chan int)
res[0] = factorial(in)
res[1] = make(chan int)
res[1] = factorial(in)
for n := range merge(res...)
    fmt.Println(n)
}

这是完整的代码......

$ go run main.go
# command-line-arguments
.\main.go:26: cannot use res (type [2]<-chan int) as type []<-chan int in 
argument to merge

2 个答案:

答案 0 :(得分:0)

你有两个问题:

  1. 可变参数函数需要多个args(例如,fmt.Println需要多个接口{})。您正在发送阵列。

  2. size [2]的数组与size []不同(是的,数组的大小是go中类型的一部分)。

  3. 你想要的是:

        for n := range merge(res[:]) {
    

    ...

    func merge(cs []<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    wg.Add(len(cs))
    for _, c := range cs {
        go func(ch <-chan int) {
            for n := range ch {
                out <- n
            }
            wg.Done()
        }(c)
    }
    go func() {
        wg.Wait()
        close(out)
    }()
    return out
    

    }

    https://play.golang.org/p/zTrrsRkKJV

答案 1 :(得分:0)

选择每个goroutine的chan获取资源。当你有第N个频道时,goroutine应该是N&#39;您应该使用reflect.Select

package main

import (
    "fmt"
    "math/rand"
    "reflect"
    "sync"
    "time"
)

func multpleSelect(chans []chan bool) (int, bool, bool) {
    cases := make([]reflect.SelectCase, len(chans))
    for i, ch := range chans {
        cases[i] = reflect.SelectCase{
            Dir: reflect.SelectRecv,
            Chan: reflect.ValueOf(ch),
        }
    }

    i, v, ok := reflect.Select(cases)
    return i, v.Interface().(bool), ok
}

func main() {
    rand.Seed(time.Now().UnixNano())

    chans := make([]chan bool, 100)
    for i := 0; i < 100; i++ {
        chans[i] = make(chan bool)
    }


    var wg sync.WaitGroup
    go func() {
        wg.Add(1)

        if ch, v, ok := multpleSelect(chans); ok {
            fmt.Printf("I am chan-%v, value is %v\n", ch, v)
        }
        wg.Done()
    }()

    chans[rand.Int() % len(chans)] <- true

    wg.Wait()
}