// 上面说明了派生类成员方法名与基类成员方法名相同时基类方法将被覆盖的情况,这对于成员变量名来说,规则也是一致的。
// package main
import "fmt"
type Base struct {
Name string
}
type Base1 struct {
Name string
}
type Derived struct {
Base
Base1
Name string
}
func main() {
d := &Derived{}
d.Name = "Derived"
d.Base.Name = "Base"
fmt.Println(d.Name) // Derived
fmt.Println(d.Base.Name) // Base
}
名字冲突
// 匿名组合相当于以其类型名称(去掉包名部分)作为成员变量的名字。
// 那么按此规则,类型中如果存在两个同名的成员,即使类型不同,但我们预期会收到编译错误。
package main
import "log"
type Logger struct {
Level int
}
type MyJob struct {
*Logger
Name string
*log.Logger // duplicate field Logger
}
func main() {
job := &MyJob{}
}
// 报错
reflect.StructOf: duplicate field X
// 同一深度,且没有被覆盖,直接调用d.Name还是会冲突
// 但是可以使用d.Base.Name
package main
import "fmt"
type Base struct {
Name string
}
type Base1 struct {
Name string
}
type Derived struct {
Base
Base1
// Name string
}
func main() {
d := &Derived{}
d.Name = "Derived"
d.Base.Name = "Base"
fmt.Println(d.Name) // Derived
fmt.Println(d.Base.Name) // Base
}