结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字
比如:
运行结果:
所以此时类型int与bool也就是Car字段的名字
匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体
比如,车(Car)结构体可以包含引擎(Engine)结构体:
运行结果:
再罗嗦一下,匿名字段名就是类型名,所以c.Engine可以得到Engine结构体,再拿到其Power字段
在Go中,内嵌结构体特殊一点,我们可以通过父结构体直接拿到内嵌结构体的字段,而不需要通过内嵌结构体间接获得
比如Power字段,除了上面的方式获得外,还可以:
结果是一样的:
Go语言中的继承是通过内嵌或组合来实现的,所以可以说,在Go语言中,相比较于继承,组合更受青睐
除了可以直接读取内嵌结构体的字段外,还可以直接执行其方法:
我们在Engine结构体上定义一个方法Tell,可以通过两种方法执行它:
c.Engine.Tell()
c.Tell()
结果:
内层结构体被简单的插入或者内嵌进外层结构体。这个简单的“继承”机制提供了一种方式,使得可以从另外一个或一些类型继承部分或全部实现
假设一个结构体A包裹了另一个匿名结构体B,而B又包裹了另一个结构体C,C中有字段Name,如果要读取Name,也是两种办法:
A.B.C.Name
A.Name
当然,如果结构体A本身就有一个字段Name,就无法通过上面方法二直接拿到C的Name了
明天接着讲结构体~