Golang备忘 - 02 杂项:面向对象,通道

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

面向对象

OO语言最重要的三方面分别是:封装、继承和多态,在Go中它们如何体现:
封装:即数据隐藏,与别的OO语言有4个或更多访问层次相比,Go简化为2层:

  • 包范围内的:通过标识符首字母小写,对象只能在它所在的包内可见
  • 可导出的:通过标识符首字母大写,对象对所在包以外也可见

继承:用组合实现,内嵌一个或多个包含想要的行为(字段和方法)的类型;
多重继承可以通过内嵌多个类型实现

多态:用接口实现,某些类型的实例可以赋给它所实现的任意接口类型的变量。
类型和接口是松耦合的,并且多重继承可以通过实现多个接口实现

备注:类型只拥有自己所在包中定义的方法

通道(channel)

把一个进程中的两个goroutine比作汽车工作里的两个生产车间,
每个车间在分到CPU时间片时就可以将自己的生产过程继续下去,
生产车间由墙分隔开来,两个车间互不可见,生产过程互不干扰。
那么,channel就是两个车间用于传递工具或零件的小窗口。

non-buffered channel

无缓冲的channel,只有读写双方都准备好时,读写操作才能完成,否则阻塞。
好比生产车间A和B之间通过小窗口传递零件,传递方A必须等接收方B从他手上接过零件时才能松手;
接收方B想取用一个零件,则伸手去取,如果没有则等待,直到传递方A将零件放到他手上。

buffered channel

有缓冲的channel,好比生产车间A和B之间的小窗口放了个有大小限制的盒子。
对于写入方,只有buffer满时才阻塞;对于读取方,只有buffer空时才阻塞。

特殊状态下的channel读写

如果一个channel被关闭,或者channel为零值nil(未被初始化,被赋值为nil),读写行为都有所不同。

  1. 已关闭的channel永远不阻塞
  • 向已关闭的channel写入会pannic
  • 从已关闭的channel中读取会读到相应类型的零值
    (对于buffered channel且缓冲有数据,首先会读取到缓冲的数据,取完后再读取会读取到相应类型的零值)
  1. 对零值的channel的读写一定会阻塞

参考

《Go入门指南》https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/directory.md

《说一说Go语言并发模型中的Channel》http://www.infoq.com/cn/minibooks/freewheel-minibook-go


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

本文来自:开源中国博客

感谢作者:nnealguo

查看原文:Golang备忘 - 02 杂项:面向对象,通道

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

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