Ver Fonte

ch10.5 OK

leisore há 10 anos atrás
pai
commit
caf6cd9d5f
2 ficheiros alterados com 27 adições e 1 exclusões
  1. 26 1
      eBook/10.5.md
  2. 1 0
      eBook/directory.md

+ 26 - 1
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)

+ 1 - 0
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 高级编程