我试图在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
如何解决此问题?
答案 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)
}
答案 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)
}
界面将帮助您接受父结构