如何将“子”结构传递给接受“父”结构的函数?

我正在尝试在 Go 中使用继承,尽管继承在“技术上”不受支持(据我所知),但您可以通过使用匿名字段获得类似的功能。


这是我跨两个结构定义“继承”的方式:


//Parent struct:


type FSEntity struct {

    guid GUIDNumber

}


//Child struct:


type DataBlock struct {

    FSEntity

    data []byte

}

我现在有一个定义如下的函数,它应该接受父 struct 的实例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

我该如何解决这个问题?


慕桂英3389331
浏览 170回答 3
3回答

慕仙森

我认为您使用的术语正在给您带来问题。简而言之,您只需要像这样引用内部结构;Put(dataBLock.FSEntity)但需要澄清的是,这里没有父/子关系。您正在使用一种称为嵌入的语言功能,其工作方式类似于组合(即一种类型由其他类型组成),只有您嵌入的内容将其字段/方法提升到嵌入范围。出于这个原因,您不能传入您称为“孩子”的类型,因为这里没有像从类型继承时那样的多态行为,而是您的类型是由它组成的,但您可以访问它的字段而无需额外的间接级别。由于您的方法接受嵌入类型作为参数,因此您必须显式引用它才能仅传递它。外部结构绝不是那种类型。

30秒到达战场

它不完全是继承,其想法是将 Put 定义为方法func (entity FSEntity) Put() {....}然后嵌入后type DataBlock struct {    FSEntity    data []byte}DataBlock 可以使用这个方法dataBLock.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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go