结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字


比如:

结构体Car中定义了两个匿名字段,分别为int与bool

运行结果:

所以此时类型int与bool也就是Car字段的名字


匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体

比如,车(Car)结构体可以包含引擎(Engine)结构体:

运行结果:

再罗嗦一下,匿名字段名就是类型名,所以c.Engine可以得到Engine结构体,再拿到其Power字段


在Go中,内嵌结构体特殊一点,我们可以通过父结构体直接拿到内嵌结构体的字段,而不需要通过内嵌结构体间接获得


比如Power字段,除了上面的方式获得外,还可以:

结果是一样的:

Go语言中的继承是通过内嵌或组合来实现的,所以可以说,在Go语言中,相比较于继承,组合更受青睐


除了可以直接读取内嵌结构体的字段外,还可以直接执行其方法:

我们在Engine结构体上定义一个方法Tell,可以通过两种方法执行它:

  1. c.Engine.Tell()

  2. c.Tell()

结果:

内层结构体被简单的插入或者内嵌进外层结构体。这个简单的“继承”机制提供了一种方式,使得可以从另外一个或一些类型继承部分或全部实现


假设一个结构体A包裹了另一个匿名结构体B,而B又包裹了另一个结构体C,C中有字段Name,如果要读取Name,也是两种办法:

  1. A.B.C.Name

  2. A.Name

当然,如果结构体A本身就有一个字段Name,就无法通过上面方法二直接拿到C的Name了



明天接着讲结构体~