通过range取通道内数据的疑问

来源:13-7 通过for range遍历channel和close关闭channel

evilchaos

2021-06-28

对于通道内的数据,我放入一个数后,协程里面通过range取完数后,range方法就应该是结束执行了啊,为啥再放一个数他还能继续在range逻辑内打印出来?

写回答

2回答

bobby

2021-06-30

package main

import (
   "fmt"
   "sync"
   "time"
)

var wg sync.WaitGroup

func consumer(queue chan int){
   defer wg.Done()
   for {
      data, ok := <- queue
      if !ok {
         break
      }
      fmt.Println(data)
      time.Sleep(time.Second)
   }
}


func main() {
   /*
   channel提供了一种通信机制,定向,python java消息队列
    */
   //1. 定义一个channel
   var msg chan int
   //2. 初始化这个channel, 两种方式:
   //msg = make(chan int) //第一种方式: 无缓冲
   msg = make(chan int, 1) //第二种初始化方式: 有缓冲空间
   //3. 在go语言中 使用make初始化的有三种, 1. slice 2. map 3. channel
   msg <- 1 //将1放入到channel中

   wg.Add(1)
   go consumer(msg)
   msg <- 2
   //关闭channel, 1. 已经关闭的channel不能再发送数据, 2. 已经关闭的channle消费者能继续取数据吗?
   //已经关闭的channel 能够继续取数据, 知道数据取完为止
   close(msg)
   wg.Wait()
}


0
0

bobby

2021-06-29

你贴一下代码我看看

0
1
evilchaos
就是你13-7这一章讲的那个demo例子啊
2021-06-29
共1条回复

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程