代码示例:
也会报错如下:
上面,从 chan 取出数据,可是没有数据了 。此时,它会把 接收者 G2 阻塞掉,也是和G1发送者一样,也会执行 gopark 将状态改为 waiting , 不一样的点就是 。
正常情况下 , 接收者G2作为取出数据是去 buf 读取数据的 , 但现在,buf 为空了 , 此时,接收者G2会将sudog导出来 , 因为现在G2已经被阻塞了嘛,会把G2给G,然后将t := -ch中变量t是在栈上的地址,放进去elem,也就是说,只存它的地址指针在sudog里面 。
最后 , ch - 200当G1往 chan 添加200这个数据,正常情况是将数据添加到buf里面,然后唤醒 G2 是吧,而现在是将 G1 的添加200数据直接干到刚才G2阻塞的t这里变量里面 。
你会认为,这样真的可以吗?想一想 , G2 本来就是已经阻塞了 , 然后我们直接这么干肯定没有什么毛病,而且效率提高了 , 不需要再次放入buf再取出,这个过程也是需要时间 。不然 , 不得往chan添加数据需要加锁、拷贝、解锁一序列操作,那肯定就慢了,我想Go语言是为了高效及内存使用率的考虑这样设计的 。(注意 , 一般都是在runtime里面完成,不然会出现象安全问题 。)
总结:
chan 类型的特点:chan 如果为空,receiver 接收数据的时候就会阻塞等待,直到 chan 被关闭或者有新的数据到来 。有这种个机制,就可以实现 wait/notify 的设计模式 。
相关面试题:
golang面试题2之判断字符串中字符是否全都不同请实现 个算法go语言基础语法面试题,确定 个字符串的所有字符【是否全都不同】 。这 go语言基础语法面试题我们要求【不允
许使 额外的存储结构】 。给定 个stringgo语言基础语法面试题,请返回 个bool值,true代表所有字符全都
不同,false代表存在相同的字符 。保证字符串中的字符为【ASCII字符】 。字符串的
度 于等于【3000】 。
这 有 个重点,第 个是 ASCII字符,ASCII字符 字符 共有256个 , 其中128个是常
字符,可以在键盘上输。128之后的是键盘上 法找到的 。
然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使 额外的储存结
构,且字符串 于等于3000 。
如果允许其他额外储存结构 , 这个题 很好做 。如果不允许的话,可以使 golang内置
的 式实现 。
通过 strings.Count 函数判断go语言基础语法面试题:
使 的是golang内置 法 strings.Count ,可以 来判断在 个字符串中包含
的另外 个字符串的数量
还有不同的方法同样可以实现 , 你了解吗?
推荐go相关技术 专栏
gRPC-go源码剖析与实战_带你走进gRPC-go的源码世界-CSDN博客
go语言基础语法面试题的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于golang基础面试题、go语言基础语法面试题的信息别忘了在本站进行查找喔 。
推荐阅读
- 手机怎么调屏幕赫兹,手机赫兹怎么设置
- 手机拼音是什么,手机拼音怎么写的拼音怎么写
- 电脑好玩的模拟游戏,电脑模拟游戏推荐
- 你是怎么安装mysql的 怎么安装mysql安装包
- flutter橡皮擦,flutter 画布
- 安卓系统可以安装定位系统,安卓手机可以弄定位吗
- erp和会计系统的区别,erp软件与会计软件有何联系
- go语言template go语言适合做什么
- erp系统生产模块操作,erp生产模块流程图