|
@@ -91,8 +91,33 @@ func main() {
|
|
|
|
|
|
|
|
创建一个结构体,它有一个具名的float成员,2个匿名成员,类型分别是int和string。通过结构体字面量新建一个结构体实例并打印它的内容。
|
|
创建一个结构体,它有一个具名的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)
|
|
- [目录](directory.md)
|
|
|
-- 上一节:[10.5 带标签的结构体](10.4.md)
|
|
|
|
|
|
|
+- 上一节:[10.4 带标签的结构体](10.4.md)
|
|
|
- 下一节:[10.6 方法](10.6.md)
|
|
- 下一节:[10.6 方法](10.6.md)
|