是否可以在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
答案 0 :(得分:0)
你有两个问题:
可变参数函数需要多个args(例如,fmt.Println需要多个接口{})。您正在发送阵列。
size [2]的数组与size []不同(是的,数组的大小是go中类型的一部分)。
你想要的是:
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
}
答案 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()
}