如何创建通道数组?
例如:将以下五行替换为通道数组,大小为 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);
该语句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)
}
c := make(map[int]chan int)
for i := 1; i <= 5; i++ {
c[i] = make(chan int)
}
for _,v := range c {
fmt.Println(v)
}
你可以这样创建,使用切片和通道
的示例[]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()
}
我认为您可以在这种情况下使用缓冲通道。
通道可以被缓冲。提供缓冲区长度作为第二个参数来初始化缓冲通道:
ch := make(chan int, 5)
仅当缓冲区已满时才发送到缓冲通道块。当缓冲区为空时接收块。