Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 工厂模式中的结构继承_Go_Inheritance_Factory - Fatal编程技术网

Go 工厂模式中的结构继承

Go 工厂模式中的结构继承,go,inheritance,factory,Go,Inheritance,Factory,我需要为某些结构创建继承器: // Not interface, pure struct type Base struct { A int B string } type Child struct { Base C bool } func (c *Child) SomeLoop() { for { // business logic } } 创建子实例并从工厂返回 func maker() *Base { child := &Child {

我需要为某些结构创建继承器:

// Not interface, pure struct
type Base struct {
  A int
  B string
}

type Child struct {
  Base
  C bool
}

func (c *Child) SomeLoop() {
  for {
    // business logic
  }
}
创建子实例并从工厂返回

func maker() *Base {
  child := &Child {
    Base {
      A: 1
      B: "2"
    },
    C: false,
  }
  go child.Some()
  return child
}
从工厂生成的对象使用字段A和B作为基本结构

o := maker()
fmt.Println(o.A, o.B) 

但我无法从maker func返回子对象作为基。如何实现这种模式?

Golang没有继承,只有嵌入。不能从maker将子项返回为*Base。但是,您可以返回&child.Base,并在过程中丢失返回值中指向child的链接

最接近您想要的是为Base定义一个接口{},该接口具有函数返回A和B值的能力:

键入BaseInterface接口{//实际上不要这样命名它 //您通常会忽略Get,但是 //稍后我们会发现名称与字段冲突。 //这可以通过使它们小写(即private)来避免。 GetA int GetB字符串 } 然后,您可以为*Child实现以下功能:

//注意这是如何为Child和*Child实现BaseInterface的。 func child*child GetA int{ 返回孩子 } func child*child GetB字符串{ 返回儿童 } 然后,您可以将其作为BaseInterface返回,如果需要,稍后执行类型断言以获取*Child的原始类型:

returnedValue.*Child//是的,这确实是语法的样子。
这有时是必要的,并且已经被Golang的接收者之一Rob Pike承认是他们在此期间不自豪的语言的一个方面。需要注意的是,不要试图在代码中引入复杂的东西,而这种语言就是为了避免这些复杂的东西而设计的。

Go中没有继承。完全可以。不能将*子项作为*基返回,因为它们是不同的类型。这一点应该很清楚。你想要达到的实际目标是什么?可能还有更好的方法。看起来你是在应用其他语言生态系统中的术语。围棋本身就是一种独特的语言。因此,请告诉我们您希望实现什么样的行为—这是一种可行的方法。我希望从几个结构创建对象,并将其存储在切片对象中:=[]Base{makeChild1,//fabric of Child1 makeCHilds2,//fabric of Child2 makeChild3,//fabric of Child3}for{,o:=范围对象{fmt.Printlno.A,o.B}基本结构是外部的。我不能从外部包修改基本结构。当你说结构时,我很确定你的意思是,我是对的吗?