和传统的面向对象语言如C++和Java相比,Go语言并没有被面向对象的封装、继承、多态那一套理论束缚,而是偏向于实用主义,虽然有点面向对象的味道,但实际上却不是那么回事,写起来却一点也不别扭。

在乎实用而不在乎形式,这一点跟脚本语言很相像。脚本语言是用来干杂活的,要是动不动就来封装、继承、多态那一套未免太累。从这一点看Go跟JavaScript在意境上最为接近,都是不拘泥于形式。

在Go语言中,你可以将一个结构体包含到另外一个结构体:

对于foo来说,可以通过foo.b.hi()来调用Barhi方法,通过foo.b.msg来访问Barmsg属性。

但是如果定义Foo时将b Bar中的b忽略,只留下Bar,那么就变成将Bar“嵌入”Foo

这样,从语法上,在调用Bar的方法或属性的时候,就从foo.b.hi()变成foo.hi(),从foo.b.msg变成foo.msg。看起来像是Foo“继承”了Bar,但其实不是,因为创建Foo对象的时候,仍然需要显示构造Bar才行:

我们仍然可以通过foo.Bar.hi()以及foo.Bar.msg来访问Bar的属性。

从这方面看,Go语言是“偏好组合胜过继承(Favor composition than inheritance)”的忠实信徒。