chan管道的相关问题

来源:3-2 基础节点

果香满园

2020-03-15 09:30

func InMemSort(a chan int) chan int {
   returnData := make(chan int)
   sli := []int{}
   go func() {
      for v := range a {
         sli = append(sli, v)
      }
      sort.Ints(sli)
      for _, val := range sli {
         returnData <- val
      }
      close(returnData)
   }()
   return returnData
}

1、这块中的returndata chan 并未设置,len属性,在给returndata 中放值的时候,是否需要考虑returndata 可以接受的空间?

2、当另一个方法从returndata取值的时候,是先给returndata中将值全部放入后 range出来,还放一个 range一个?


写回答 关注

1回答

  • gypsy_gyq
    2020-03-21 22:34:29

    1、channel 是分缓冲通道和非缓冲通道的,在 make channel 的时候,如果没有指定通道容量,那么这就是一个非缓冲通道。

    非缓冲通道的特点是,必须发送和接收同时进行,否则就会等待;

    而缓冲通道不需要发送和接收同时进行,但是当通道满的时候,发送方也会阻塞,必须等到接收方从通道中拿走数据后才能继续发送。

    2、所以上面的代码没有指定容量,是一个非缓冲通道,那么必然是发送和接收同时进行的,也可以理解为 放一个 range 一个。

    果香满园

    谢谢,明白了

    2020-03-21 22:41:35

    共 1 条回复 >

搭建并行处理管道,感受GO语言魅力

通过搭建并行数据处理管道,展示go语言在并发编程方面的优势

19375 学习 · 78 问题

查看课程

相似问题