Inheritance 如何通过a';儿童';将结构转换为接受';家长';结构?

Inheritance 如何通过a';儿童';将结构转换为接受';家长';结构?,inheritance,go,struct,Inheritance,Go,Struct,我正在尝试在Go中使用继承,尽管继承在技术上不受支持(据我所知),但您可以通过使用匿名字段获得类似的功能 下面是我如何定义跨两个结构的“继承”: //Parent struct: type FSEntity struct { guid GUIDNumber } //Child struct: type DataBlock struct { FSEntity data []byte } 我现在有一个定义如下的函数,它应该接受父结构的一个实例FSEntity: Put

我正在尝试在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

如何解决此问题?

解决此问题的最简单方法是满足参数的类型:传递一个
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)
}

()

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


但要澄清的是,这里没有父母/子女关系。您正在使用一种称为嵌入的语言功能,其工作方式类似于组合(即一种类型由其他类型组成),只有您嵌入的内容的字段/方法被提升到嵌入范围。由于这个原因,您不能传入您正在调用的“child”类型,因为这里没有多态行为,就像您从一个类型继承时一样,相反,您的类型是由它组成的,但是您可以访问它的字段,而无需额外的间接级别。由于您的方法接受嵌入类型作为参数,因此必须显式引用它才能传递该参数。外部结构决不是那种类型。

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

func (entity FSEntity) Put() {....}
然后在嵌入之后

type DataBlock struct {
    FSEntity
    data []byte
}
数据块可以使用此方法

dataBLock.Put()

接口将帮助您接受父结构

,但我想要的功能是,在Put中,我还应该能够访问“子”结构变量。我认为这是不可能的。谢谢你的解释。所以我根本不可能在围棋中使用正确的继承?因为我想要的功能是在
Put()
中,我能够访问这两个类的变量,如果我简单地执行
Put(dataBLock.FSEntity)
@Ahmad,这是不可能的,如果你想访问两个结构上的变量,您必须更新
Put
的定义,使其参数的类型为
DataBlock
。围棋没有继承权。你必须以不同的方式思考这个问题。当多态性在语言中不作为一个概念存在时,您试图利用它。如果您想要这种类型的动态行为(比如包含许多类型的集合,这些类型应该具有一些公共行为/字段/ect),那么您可以在接口后面抽象它。
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)
}