如何通过一个孩子'结构成一个接受父母的功能'结构?

时间:2016-05-03 18:33:03

标签: inheritance go struct

我试图在Go中使用继承,虽然继承不是技术上的'支持(据我所知),您可以使用匿名字段获得类似的功能。

以下是我如何定义'继承'跨越两个结构:

//Parent struct:

type FSEntity struct {
    guid GUIDNumber
}

//Child struct:

type DataBlock struct {
    FSEntity
    data []byte
}

我现在有一个定义如下的函数,它应该接受父结构FSEntity的一个实例:

Put(entity FSEntity) {....}

但是当我尝试将DataBlock的实例(通过继承也是FSEntity)传递到上面的Put函数时,如下所示:

guidNumber := GUIDNumber(1234)
value := []byte("sample string")
dataBLock := DataBlock{FSEntity{guidNumber}, value}

Put(dataBLock)

在上面的最后一行,我收到此错误:

cannot use dataBLock (type DataBlock) as type FSEntity in argument to Put

如何解决此问题?

4 个答案:

答案 0 :(得分:8)

我认为您使用的术语会给您带来麻烦。在put中,你只需要像这样引用内部结构; Put(dataBLock.FSEntity)

但澄清一下,这里没有父/子关系。您正在使用一种称为嵌入的语言功能,并且像组合一样工作(即一种类型由其他类型组成),只有您嵌入的内容将其字段/方法提升到嵌入范围。出于这个原因,你无法传递你打电话给孩子的类型。因为这里没有像从类型继承的多态行为,而是你的类型由你组成,但你可以访问它的字段,而没有额外的间接级别。由于您的方法接受嵌入类型作为参数,因此您必须明确引用它以仅传递它。外部结构绝不是那种类型。

答案 1 :(得分:2)

它不完全是继承,而且想法是将Put定义为方法

func (entity FSEntity) Put() {....}

然后嵌入

type DataBlock struct {
    FSEntity
    data []byte
}

DataBlock可以使用此方法

dataBLock.Put()

答案 2 :(得分:0)

解决它的最简单方法是满足参数的类型:传递FSEntity。如果您只需要从嵌入它的结构中获取FSEntity,那么您只需执行dataBlock.FSEntity

//Parent struct:

type FSEntity struct {
    guid string
}

//Child struct:

type DataBlock struct {
    FSEntity
    data []byte
}

func main() {
    myVar := DataBlock{}
    myVar.guid = "test"
    myVar.data = []byte("moar test")
    a(myVar.FSEntity)
}

func a(x FSEntity) {
    fmt.Printf("%+v\n", x)
}

Go playground

答案 3 :(得分:0)

package main

import (
    "fmt"
)

type Guider interface {
    Guid() string
}
type FSEntity struct {
    guid string
}
func (e FSEntity) Guid() string {
    return e.guid
}

//Child struct:

type DataBlock struct {
    FSEntity
    data []byte
}

func main() {
    myVar := DataBlock{}
    myVar.guid = "test"
    myVar.data = []byte("moar test")
    Put(myVar)
}

func Put(x Guider) {
    fmt.Printf("%+v\n", x)
}

界面将帮助您接受父结构