diff --git a/eBook/10.5.md b/eBook/10.5.md index 3c0da73..cc542b6 100644 --- a/eBook/10.5.md +++ b/eBook/10.5.md @@ -91,8 +91,33 @@ func main() { 创建一个结构体,它有一个具名的float成员,2个匿名成员,类型分别是int和string。通过结构体字面量新建一个结构体实例并打印它的内容。 +## 10.5.3 命名冲突 + +当两个成员拥有相同的名字(可能是继承来的名字)时该怎么办呢? + + * 外层名字会覆盖内层名字,这提供了一种重载成员或方法的方式 + * 如果相同的名字在同一级别出现了两次,如果这个名字被程序使用了,将会引发一个错误(不使用没关系)。没有办法来解决这种问题引起的二义性,必须由程序员自己修正。 + +例子: + +```go +type A struct {a int} +type B struct {a, b int} + +type C struct {A; B} +var c C; +``` + + 规则2:使用c.a是错误的,到底是c.A.a还是c.B.a呢?会导致编译器错误:*ambiguous DOT reference c.a disambiguate with either c.A.a or c.B.a* + +```go +type D struct {B; b float32} +var d D; +``` + + 规则1:使用d.b是没问题的:它是float32,而不是B的b。如果想要内层的b可以通过d.B.b得到。 ## 链接 - [目录](directory.md) -- 上一节:[10.5 带标签的结构体](10.4.md) +- 上一节:[10.4 带标签的结构体](10.4.md) - 下一节:[10.6 方法](10.6.md) diff --git a/eBook/directory.md b/eBook/directory.md index ef36281..11b930d 100644 --- a/eBook/directory.md +++ b/eBook/directory.md @@ -89,6 +89,7 @@ - 10.2 [使用工厂方法创建结构体实例](10.2.md) - 10.3 [使用自定义包中的结构体](10.3.md) - 10.4 [带标签的结构体](10.4.md) + - 10.5 [匿名成员和内嵌结构体](10.5.md) - 第11章:接口(interface)与反射(reflection) ## 第三部分:Go 高级编程