mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 05:33:04 +08:00
ch10.5 OK
This commit is contained in:
@@ -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)
|
||||
|
@@ -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 高级编程
|
||||
|
Reference in New Issue
Block a user