golang chan被关闭后读写的那点事

func main() {
  
  closeReadChan()

  closeWriteChan()

   closeReadChan2()
}
// 从有缓冲被关闭的chan写数据, 报错: panic: send on closed channel
func closeWriteChan() {
   wg := sync.WaitGroup{}
   ch := make(chan int, 100)
   wg.Add(2)
   go func() {
      defer wg.Done()
      close(ch)
   }()
   time.Sleep(time.Second * 2)
   go func() {
      defer wg.Done()
      for i := 1; i <= 100; i++ {
         ch <- i
      }
   }()

   wg.Wait()
}

// 从无缓存被close的channel中读数据, 可正常读取
func closeReadChan2() {
   wg := sync.WaitGroup{}
   ch := make(chan string)
   wg.Add(2)
   go func() {
      defer wg.Done()
      for i := 1; i <= 100; i++ {
         ch <- fmt.Sprintf("%v%v", i, time.Now().String())
      }
      close(ch)
   }()
   time.Sleep(time.Second * 2)
   for x := range ch {
      fmt.Println(x)
   }
   wg.Done()
   wg.Wait()
}

// 从有缓存被close的channel中读数据, 可正常读出数据
func closeReadChan() {

   wg := sync.WaitGroup{}
   ch := make(chan int, 100)
   wg.Add(2)
   go func() {
      defer wg.Done()
      for i := 1; i <= 100; i++ {
         ch <- i
      }
      close(ch)
   }()
   time.Sleep(time.Second * 5)
   go func() {
      defer wg.Done()
      for x := range ch {
         fmt.Println(x)
      }
   }()

   wg.Wait()
}
经验分享 程序员 微信小程序 职场和发展