面向对象
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),读写行为都有所不同。
- 已关闭的channel永远不阻塞
- 向已关闭的channel写入会pannic
- 从已关闭的channel中读取会读到相应类型的零值
(对于buffered channel且缓冲有数据,首先会读取到缓冲的数据,取完后再读取会读取到相应类型的零值)
- 对零值的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
有疑问加站长微信联系(非本文作者)