如何分配通道数组

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

【讨论】:

一个数组可以按照你的顺序填充,缓冲通道只是不同的东西

以上是关于如何分配通道数组的主要内容,如果未能解决你的问题,请参考以下文章

使用通道时Rust中的内存分配

将均衡器分配给单个通道

ssh heroku 错误“通道 0 上的 PTY 分配请求失败”

如何在一个分配 C 中动态分配二维数组

如何使用 C++ 中的指针动态分配和解除分配二维数组?

您可以将 3 通道图像数据分配给 QCustomPlots ColorMap 函数吗?