struct A {}
func (a *A) BName(id int) string {
return a.Name
}
struct B {
*A
Name string
}
func main() {
b := &B{Name: "abc"}
fmt.Println(b.Name)
}
代码失败,我想知道如何编写代码来实现,A.BName可以访问B struct属性Name
答案 0 :(得分:6)
这是不可能的。 struct A对嵌入的类型一无所知。想一想,A可以嵌入任何其他结构中,所以你怎么能提前知道嵌入A的结构的类型。
如果你想这样做,你需要将B的引用,外部结构放入A。
type A struct {
*B
}
func (a *A) PrintName() string { return a.B.Name }
type B struct {
A // no need to use a pointer here
Name string
}
var b B
b.A.B = &b
fmt.Println(b.PrintName())
答案 1 :(得分:1)
A
访问B
让我想起了一种is-a关系,其中A
“是一个”B
。
文章“Is Go an Object Oriented language?”确实注意到 Go中没有真正的子类型:
示例:
package main
type A struct{
// doesn't know anything about B
}
type B struct {
A //B is-a A
}
func (a *A) f() { fmt.Println("A.f") }
func (b *B) f() { fmt.Println("B.f") }
func save(A) {
//do something
}
func main() {
b := B
save(&b) //OOOPS! b IS NOT A
b.f() // B.f()
b.A.f() // A.f()
}
多重继承的一个问题是语言通常不明显,有时甚至不明确,当多个父类存在相同的方法时,使用哪些方法。
使用Go,您始终可以通过与该类型同名的属性访问各个方法。
实际上,当您使用匿名字段时,Go正在创建一个与您的类型同名的访问者。
这就是“b.A
”:匿名字段的访问者。