2014-09-04 53 views

回答

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()) 
+0

好吧,谢谢您的回答。 – jame2981 2014-09-04 11:14:58

+0

考虑是否可以使用接口来完成您想要做的事情。 – andlabs 2014-09-04 12:29:45

1

A访问B让我想起的是,有关系,其中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”是:一个访问到一个匿名场..

相关问题