14.13 说出一个避免Goroutine泄露的措施 - Go语言中文社区

14.13 说出一个避免Goroutine泄露的措施


可以通过 context 包来避免内存泄漏。

  1. func main() {
  2. ctx, cancel := context.WithCancel(context.Background())
  3. ch := func(ctx context.Context) <-chan int {
  4. ch := make(chan int)
  5. go func() {
  6. for i := 0; ; i++ {
  7. select {
  8. case <- ctx.Done():
  9. return
  10. case ch <- i:
  11. }
  12. }
  13. } ()
  14. return ch
  15. }(ctx)
  16. for v := range ch {
  17. fmt.Println(v)
  18. if v == 5 {
  19. cancel()
  20. break
  21. }
  22. }
  23. }

下面的 for 循环停止取数据时,就用 cancel 函数,让另一个协程停止写数据。如果下面 for 已停止读取数据,上面 for 循环还在写入,就会造成内存泄漏。

版权声明:本教程内容除了本站原创内容外,还有来源自C语言编程网,博客园,CSDN等技术站点,感谢相关博主原创文章,转载请附上原文出处链接和本声明。
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 阅读 ( 612 )
  • 分类:Go

0 条评论

官方社群

GO教程

猜你喜欢