18.5 命名冲突

结构体两个字段拥有相同的名字(可能是继承来的名字)时会怎么样呢?外层名字会覆盖内层名字(但是两者的内存空间都保留)。

当相同的字段名在同一层级出现了两次,而且这个名字被程序直接选择使用了,就会引发一个错误,可以采用逐级选择使用的方式来避免这个错误。例如:

type A struct {a int}
type B struct {a int}
type C struct {
A
B
}
var c C

上面代码中不能直接选择使用c.a,编译时会报告ambiguous selector c.a,且编译不能通过。但是完整逐级写出来就正常了,例如c.A.a或者c.B.a 都可以正确得到对应的值。

解决直接选择使用c.a引发二义性的问题一般应该由程序员逐级完整写出避免错误。

下一节:接口(interface)类型是Go语言的一种数据类型。而因为所有的类型包括自定义类型都实现了空接口interface{},所以空接口interface{}可以被当做任意类型的数值。