Go中使用struct关键字定义结构体来达到封装的目的。struct描述内存中的区域,其中具名值拥有自己的类型并引用内存块中的一个slot。
Go没有像其它面向对象语言中的类继承概念。但是,它可以通过在结构体或者接口中嵌入其它的类型来使用被嵌入类型的功能。
通过直接嵌入结构体(没有字段名)可以避免在实现相应方法时做一次转换,被嵌入类型的方法可以被直接使用。
嵌入和类继承有一个重要的区别:我们可以嵌入类型,之后被嵌入类型方法就变成了我们的方法。但是,当这些方法被调用时,方法的接受者为被嵌入的类型,而不是我们自己的类型。
类型嵌入会导致命名冲突的问题,但是解决的方法很简单:首先,字段或者方法X会隐藏掉被嵌套在深层次中的其它X。其次,如果相同的名字出现在了同一个嵌套层次中,通常会导致错误。但是,如果重名只出现在类型定义中,除了类型定义外的其它地方都不会引用到它,这是ok的,这种限制可以保护类型在其它地方被嵌入的更改。如果一个字段被添加后会和其它子类型中的字段冲突,但是这两个冲突的字段都没有使用,那么一切都OK。