ToB企服应用市场:ToB评测及商务社交产业平台
标题:
golang channel
[打印本页]
作者:
傲渊山岳
时间:
2023-12-23 04:13
标题:
golang channel
”不要以共享内存的方式来通信,相反,要通过通信来共享内存“
golang 的一个思想,不整文的,整点武的,具体来看channel 怎么做的
有一个很关键的 golang MPG 模型再单独分析,这篇先只分析 channel
定义
// runtim/chan.go
type hchan struct {
qcount uint // 通道里的元素数量
dataqsiz uint // 通道的总大小
buf unsafe.Pointer // 通道底层循环数组的指针
elemsize uint16 // 每个元素的大小
closed uint32 // 通道是否关闭,不能重复关闭,会 panic
elemtype *_type // 通道里元素的类型
sendx uint // 通道里发送元素的下标
recvx uint // 接受元素的下标
recvq waitq // 准备接受的协程链表
sendq waitq // 准备发送的写成链表
lock mutex // 通道锁,chan 是并发安全的
}
复制代码
链表,保存发送或接受协程
// runtim/chan.go
type waitq struct {
first *sudog
last *sudog
}
复制代码
初始化
channel使用 make 初始化
c := make(chan int) // 无缓冲
c2 := make(chan int,10) // 有缓冲
复制代码
当无缓冲时,直接创建,当有缓冲时,还要调用 mallocgc 函数,申请空间,具体代码可以看 runtime/chan.go
发送数据
使用来说很简单,下面的代码如果 channel 满了或者无缓冲无接受者的话就会阻塞
[code]c
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4