为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕桂英3389331 2022-01-10 10:36:32
我正在尝试在 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我该如何解决这个问题?
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

我认为您使用的术语正在给您带来问题。简而言之,您只需要像这样引用内部结构;Put(dataBLock.FSEntity)

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


查看完整回答
反对 回复 2022-01-10
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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


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

然后嵌入后


type DataBlock struct {

    FSEntity

    data []byte

}

DataBlock 可以使用这个方法


dataBLock.Put()


查看完整回答
反对 回复 2022-01-10
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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

}


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信