今天小编给大家分享一下Go channel结构体读写和关闭的过程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
type hchan struct { qcount uint // 当前队列中元素的数量 dataqsiz uint // 缓冲区大小,即可以缓存的元素数量 buf unsafe.Pointer // 指向队列的缓冲区 elemsize uint16 // 每个元素的大小 closed uint32 // channel 是否已关闭的标志 elemtype *_type // channel 中元素的类型 sendx uint // 下一次发送元素的位置 recvx uint // 下一次接收元素的位置 recvq waitq // 等待接收的 goroutine 队列 sendq waitq // 等待发送的 goroutine 队列 lock mutex // 用于保护 channel 的互斥锁 }
当一个 goroutine 要向 channel 中发送数据时,它会执行 chansend
函数。
这个函数首先会对 channel 进行加锁,然后判断是否有等待接收的 goroutine
如果有,则直接将数据发送给它;否则,如果缓冲区未满,则将数据放入缓冲区,队列中元素数量加一;
如果队列已满,则将当前 goroutine 加入等待发送的 goroutine 队列中,并阻塞它,等待其他 goroutine 接收数据。
当一个 goroutine 要从 channel 中接收数据时,它会执行 src/runtime/chan.go
中的 chanrecv
函数。
这个函数也会对 channel 进行加锁,然后判断是否有等待发送的 goroutine,如果有,则直接从它那里接收数据;
否则,如果缓冲区元素的数量大于 0,则从缓冲区中取出一个元素,并将队列中元素数量减一。
如果缓冲区为空,则将当前 goroutine 加入等待接收的 goroutine 队列中,并阻塞它,等待其他 goroutine 发送数据。
当一个 goroutine 要关闭 channel 时,它会执行 src/runtime/chan.go
中的 closechan
函数。
这个函数会对 channel 进行加锁,然后将 closed
标志置为 1,表示 channel 已经关闭。
然后遍历等待发送和等待接收的 goroutine 队列,将它们全部唤醒,并返回一个特殊的值来表示 channel 已经关闭。
以上就是“Go channel结构体读写和关闭的过程是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。