Golang知识点记录 -- channel

hongtj · · 1137 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

执行下面的代码会发生什么?

 package main import (	"fmt"	"time" ) func main() {	ch := make(chan int, 1000)	go func() {	for i := 0; i < 10; i++ {	ch <- i	}	}()	go func() {	for {	a, ok := <-ch	if !ok {	fmt.Println("close")	return	}	fmt.Println("a: ", a)	}	}()	close(ch)	fmt.Println("ok")	time.Sleep(time.Second * 100) }

答案解析:

记住 channel 的一些关键特性:

  • 给一个 nil channel 发送数据,造成永远阻塞
  • 从一个 nil channel 接收数据,造成永远阻塞
  • 给一个已经关闭的 channel 发送数据,引起 panic
  • 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
  • 无缓冲的channel是同步的,而有缓冲的channel是非同步的

 

本题中,因为 main 在开辟完两个 goroutine 之后,立刻关闭了 ch, 结果就是 panic:

panic: send on closed channel

备注:文章内容来自本站go每日一题

 


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1137 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传