如何分配通道数组
Posted
技术标签:
【中文标题】如何分配通道数组【英文标题】:How to allocate an array of channels 【发布时间】:2011-02-22 23:52:08 【问题描述】:如何创建一个通道数组?
例如:将以下五行替换为通道数组,大小为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);
【问题讨论】:
【参考方案1】:语句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)
【讨论】:
为什么你的解决方案比Chickencha简洁地道的chans := make([]chan int, 5)
更好?
如果通道没有明确分配make(chan int)
,它们将默认为nil
。【参考方案2】:
c := make(map[int]chan int)
for i := 1; i <= 5; i++
c[i] = make(chan int)
for _,v := range c
fmt.Println(v)
你可以这样创建,使用切片和通道
【讨论】:
【参考方案3】:[]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()
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案4】:我认为在这种情况下您可以使用缓冲通道。
频道可以被缓冲。提供缓冲区长度作为初始化缓冲通道的第二个参数:
ch := make(chan int, 5)
仅当缓冲区已满时才发送到缓冲通道块。缓冲区为空时接收块。
https://tour.golang.org/concurrency/3
【讨论】:
一个数组可以按照你的顺序填充,缓冲通道只是不同的东西以上是关于如何分配通道数组的主要内容,如果未能解决你的问题,请参考以下文章