如果 struct A 嵌入在 B 中,A 上的方法可以访问 B 的方法和字段吗?

 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


慕桂英3389331
浏览 172回答 2
2回答

长风秋雁

这不可能。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 Bb.A.B = &bfmt.Println(b.PrintName())

翻阅古今

A访问B让我想起了 is-a 关系,其中A"is-a" B。文章“ Go 是一种面向对象的语言吗? ”确实指出Go 中没有真正的子类型:如果它真的是子类型,那么匿名字段将导致外部类型成为内部类型。在 Go 中,情况并非如此。这两种类型仍然不同。匿名字段仍然可以访问,就像它们被嵌入一样例子:package maintype 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”:匿名字段的访问者..
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go