32

如何创建通道数组

例如:将以下五行替换为通道数组,大小为 5:

var c0 chan int = make(chan int);
var c1 chan int = make(chan int);
var c2 chan int = make(chan int);
var c3 chan int = make(chan int);
var c4 chan int = make(chan int);
4

4 回答 4

74

该语句var chans [5]chan int将分配一个大小为 5 的数组,但所有通道都是nil.

一种方法是使用切片文字:

var chans = []chan int {
   make(chan int),
   make(chan int),
   make(chan int),
   make(chan int),
   make(chan int),
}

如果您不想重复自己,则必须对其进行迭代并初始化每个元素:

var chans [5]chan int
for i := range chans {
   chans[i] = make(chan int)
}
于 2010-06-02T14:17:29.630 回答
1
c := make(map[int]chan int)
for i := 1; i <= 5; i++ {
    c[i] = make(chan int)
}
for _,v := range c {
    fmt.Println(v)
}

你可以这样创建,使用切片和通道

于 2021-07-13T10:09:50.443 回答
0

的示例[]chan[]string。它可以扩展到所有类型的案例。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var ch [4]chan []string
    for i := range ch {
        ch[i] = make(chan []string, 1)
    }

    ch1 := []string{"this", "that", "who"}

    ch2 := []string{"one", "two", "three"}

    ch3 := []string{"four", "five", "six"}

    ch4 := []string{"seven", "eight", "nine"}

    wg := sync.WaitGroup{}

    wg.Add(1)
    for i := 0; i < 4; i++ {
        switch i {
        case 0:
            ch[i] <- ch1
        case 1:
            ch[i] <- ch2
        case 2:
            ch[i] <- ch3
        case 3:
            ch[i] <- ch4
        default:
        }
    }
    wg.Done()

    for i := 0; i < 4; i++ {
        fmt.Println(<-ch[i])

    }
    wg.Wait()
}
于 2021-10-27T09:16:07.617 回答
-4

我认为您可以在这种情况下使用缓冲通道。

通道可以被缓冲。提供缓冲区长度作为第二个参数来初始化缓冲通道:

ch := make(chan int, 5)

仅当缓冲区已满时才发送到缓冲通道块。当缓冲区为空时接收块。

https://tour.golang.org/concurrency/3

于 2018-05-10T04:51:26.063 回答