2.通道通道是一种数据结构,可以让goroutine之间进行安全的数据通信 。通道可以帮用户避免其他语言里常见的共享内存访问的问题 。
并发的最难的部分就是要确保其他并发运行的进程、线程或goroutine不会意外修改用户的数据 。当不同的线程在没有同步保护的情况下修改同一个数据时,总会发生灾难 。在其他语言中,如果使用全局变量或者共享内存,必须使用复杂的锁规则来防止对同一个变量的不同步修改 。
为了解决这个问题,通道提供了一种新模式,从而保证并发修改时的数据安全 。通道a
文章插图
图1-3 使用通道在goroutine之间安全地发送数据
图1-3中有3个goroutine,还有2个不带缓存的通道 。第一个goroutine通过通道把数据传给已经在等待的第二个goroutine 。在两个goroutine间传输数据是同步的,一旦传输完成,两个goroutine都会知道数据已经完成传输 。当第二个goroutine利用这个数据完成其任务后,将这个数据传给第三个正在等待的goroutine 。这次传输依旧是同步的,两个goroutine都会确认数据传输完成 。这种在goroutine之间安全传输数据的方法不需要任何锁或者同步机制 。
需要强调的是,通道并不提供跨goroutine的数据访问保护机制 。如果通过通道传输数据的一份副本,那么每个goroutine都持有一份副本,各自对自己的副本做修改是安全的 。当传输的是指向数据的指针时,如果读和写是由不同的goroutine完成的,每个goroutine依旧需要额外的同步动作 。
1.1.3 Go语言的类型系统Go语言提供了灵活的、无继承的类型系统,无需降低运行性能就能最大程度上复用代码 。这个类型系统依然支持面向对象开发,但避免了传统面向对象的问题 。如果你曾经在复杂的Java和C++程序上花数周时间考虑如何抽象类和接口,你就能意识到Go语言的类型系统有多么简单 。Go 开发者使用组合(composition)设计模式,只需简单地将一个类型嵌入到另一个类型,就能复用所有的功能 。其他语言也能使用组合,但是不得不和继承绑在一起使用,结果使整个用法非常复杂,很难使用 。在Go语言中,一个类型由其他更微小的类型组合而成,避免了传统的基于继承的模型 。
另外,Go语言还具有独特的接口实现机制,允许用户对行为进行建模,而不是对类型进行建模 。在Go语言中,不需要声明某个类型实现了某个接口,编译器会判断一个类型的实例是否符合正在使用的接口 。Go标准库里的很多接口都非常简单,只开放几个函数 。从实践上讲,尤其对那些使用类似Java的面向对象语言的人来说,需要一些时间才能习惯这个特性 。
1.类型简单Go语言不仅有类似int和string这样的内置类型,还支持用户定义的类型 。在Go语言中,用户定义的类型通常包含一组带类型的字段,用于存储数据 。Go语言的用户定义的类型看起来和C语言的结构很像,用起来也很相似 。不过Go语言的类型可以声明操作该类型数据的方法 。传统语言使用继承来扩展结构——Client继承自User,User继承自Entity,Go语言与此不同,Go开发者构建更小的类型——Customer和Admin,然后把这些小类型组合成更大的类型 。图1-4展示了继承和组合之间的不同 。
文章插图
图1-4 继承和组合的对比
2.Go接口对一组行为建模接口用于描述类型的行为 。如果一个类型的实例实现了一个接口,意味着这个实例可以执行一组特定的行为 。你甚至不需要去声明这个实例实现某个接口,只需要实现这组行为就好 。其他的语言把这个特性叫作鸭子类型——如果它叫起来像鸭子,那它就可能是只鸭子 。Go语言的接口也是这么做的 。在Go语言中,如果一个类型实现了一个接口的所有方法,那么这个类型的实例就可以存储在这个接口类型的实例中,不需要额外声明 。
在类似Java这种严格的面向对象语言中,所有的设计都围绕接口展开 。在编码前,用户经常不得不思考一个庞大的继承链 。下面是一个Java接口的例子:
interface User {public void login();public void logout();}
在Java中要实现这个接口,要求用户的类必须满足User接口里的所有约束,并且显式声明这个类实现了这个接口 。而Go语言的接口一般只会描述一个单一的动作 。在Go语言中,最常使用的接口之一是io.Reader 。这个接口提供了一个简单的方法,用来声明一个类型有数据可以读取 。标准库内的其他函数都能理解这个接口 。这个接口的定义如下:
推荐阅读
- 红茶适合女人喝吗,女人要喝什么茶好
- 如何让男人对你爱欲攀升
- 三国演义中关羽在曹营到底多少年? 刘备为什么没有支援关羽
- 男女是否适合做夫妻的10个标准
- 犹太人真的很聪明吗 犹太人到底有多聪明
- 老年人骨折与茶,老年人适合喝什么茶
- 世人对曹植的评价 曹植的历史评价
- 经常喝茶对身体有害,茶烟到底对身体有害吗
- 黄茶到底属于什么茶呢,四季春茶属于什么茶
- 花草茶的疗效,电脑族选适合自己的花草茶