【问题标题】: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);

【问题讨论】:

    标签: arrays go channel


    【解决方案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

      【讨论】:

      • 一个数组可以按照你的顺序填充,缓冲通道只是不同的东西
      猜你喜欢
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      相关资源
      最近更新 更多