在 HttpConnection 这个结构里看到了那个奇怪的 Connection 声明了吗?严格说起来这是一个匿名结构成员,在 HttpConnection 这个对象中组合了一个 Connection 对象。你可以组合任意多的对象,但在这个例子中,但它承担起了和其它语言中基类的作用。 C++ 中类内存布局规定,基类必须处于派生类内存布局的前部,但在 Go 中,开发者可以自己定义什么地方出现这个基类的实例。并且由于需要显式引用这个对象的实例,因此当组合了多个对象时,就和多重继承非常相似了。 继承有什么不好?在代码依赖关系中,继承是一种非常强的依赖关系,一旦代码写成,在不修改源代码的情况下几乎不可能改变。对于设计来说,只有一次机会来判断这样的设计是否正确,一旦设计不准确,那么再无修改的可能。然而做出这样的判断,是一件很困难的事情。 在传统的 OOP 教材中往往会有一个例子类似于这样: 猫是一种动物,猫会喵喵叫,黑猫是一种猫,它是黑色的,但它也会喵喵叫。所以猫应当从动物继承,而黑猫应当从猫继承。 请点击此处输入图片描述 正确吗?未必。 如果有一种黑猫是呜呜叫的话,就会继承自黑猫,并改写“叫”这个方法。然而,如果是有一种白猫也是呜呜叫的呢?或者一种短尾的猫也是呜呜叫的呢?虽然多态性能够改变一些行为,但就从重用的角度上看,这不是合理的设计。 如果把“叫”作为一个可以组合的功能,那么在任何一种猫重用呜呜叫和喵喵叫,那么都是在运行时的一个赋值而已。 4、 特殊的接口 接口是什么?其它语言中接口主要作为不同组件之间的契约存在,并且是强制的。接口作为一种类型,需要显式地声明某个类实现了这个接口。 还是以猫的例子:猫会叫,因此叫这个动作作为一个接口被猫这个对象实现了,然而猫也会爬,所以它还需要实现一个爬的接口。然而这种做法一点也不自然,并不是因为实现了爬这个接口,猫才是猫,难道不应该是先有了猫,才归纳出有爬这个动作吗?传统的接口概念就是这样一个本末倒置的状态,一旦对象的特性太复杂了,为了合理分解接口,这个任务会变得异常困难。 既然是契约,那么 Go 另辟蹊径,在 Go 中,接口只是方法的集合,一个对象实现了一个接口的所有方法,就说,这个对象实现了这个接口,而不需要继承、关联这个接口类型,atv直播,实际上,对象在实现的时候甚至都不需要知道这个接口是否存在。 如果存在下面的接口: type IConnectable interafce { Connect(address string) } 因为 HttpConnection 和 Connection 对象都实现了 Connect(address string)这个方法,因此这两个对象已经实现了 IConnectable 这个接口,甚至我们在实现那两个对象时,还没有定义这个接口! 下面这样的赋值就是合法的: var conn IConnectable = new(HttpConnection) 5、 其它特性 从 OOP 的角度上说,Go 采用了更为传统和淳朴的概念,相比于现在流行的 C++风格的 OOP 概念,Go 的概念更加简洁,j2直播,更加灵活。 除了 OOP 的概念之外,作为一个现代语言,Go 突出的另外一个特性是它并发机制:goroutine 和 chan。相比于其它主流语言,它的并发机制异常简单和高效,相当于 C++ 数千行代码的并发机制在 Go 中只需要几句话即可实现,线程间通讯、缓存、超时,各类机制一应俱全,这可以在另外的文章中介绍。 请点击此处输入图片描述 “To be or not to be ,that's a question." ——William Shakespeare “To GO or not to GO, that's a question.” 注: ,一个著名的开发语言排名的统计网站 2016年8月,Go 正式迈入前20名的开发语言队伍 本文作者:徐翎 Andrew(点融黑帮),任职点融网客户端开发总监,组建了移动和网站的开发团队,开发了点融网各款客户端软件。曾就职于微软等公司,参与过包括Hotmail 和Windows 在内的大型跨国际软件开发项目的研发。 (责任编辑:本港台直播) |