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

从同一函数返回接口的不同专门实现

从同一函数返回接口的不同专门实现

Go
函数式编程 2021-11-22 10:40:12
我有一些类似的数据结构,每个数据结构都有一些独特的字段。它们都实现了相同的行为接口 (DataPoint)。因此,它们的处理可以在交换每个结构的类型并通过接口中定义的方法对其进行操作的同时完成一次。我想让一个函数根据某些标准返回每种类型的空数据结构。但是,我似乎无法编译它,好像我的函数通过签名返回接口但实际上返回了一个实现,它抱怨。这是我的意思的简化示例和操场示例:https://play.golang.org/p/LxY55BC59Dpackage mainimport "fmt"type DataPoint interface {    Create() }type MetaData struct {    UniqueId string    AccountId int    UserId int}type Conversion struct {    Meta MetaData    Value int}func (c *Conversion) Create() {    fmt.Println("CREATE Conversion")}type Impression struct {    Meta MetaData    Count int}func (i *Impression) Create() {    fmt.Println("CREATE Impression")} func getDataPoint(t string) DataPoint {    if t == "Conversion" {        return &Conversion{}    } else {        return &Impression{}    }}func main() {    meta := MetaData{        UniqueId: "ID123445X",        AccountId: 1,        UserId: 2,    }    dpc := getDataPoint("Conversion")    dpc.Meta = meta    dpc.Value = 100    dpc.Create()    fmt.Println(dpc)    dpi :=  getDataPoint("Impression")    dpi.Meta = meta    dpi.Count = 42    dpi.Create()    fmt.Println(dpi)}编译产生:prog.go:51: dpc.Meta undefined (type DataPoint has no field or method Meta)prog.go:52: dpc.Value undefined (type DataPoint has no field or method Value)prog.go:58: dpi.Meta undefined (type DataPoint has no field or method Meta)prog.go:59: dpi.Count undefined (type DataPoint has no field or method Count)
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

如果没有类型断言,您将无法访问这样的字段。您只能在接口上调用方法,它对其实现细节一无所知。如果确实需要访问这些字段,请使用类型断言:


dpc := getDataPoint("Conversion")

dpc.(*Conversion).Meta = meta

dpc.(*Conversion).Value = 100

dpc.Create()


dpi := getDataPoint("Impression")

dpi.(*Impression).Meta = meta

dpi.(*Impression).Count = 42

dpi.Create()

游乐场:https : //play.golang.org/p/Ije8hfNcWS。


查看完整回答
反对 回复 2021-11-22
?
万千封印

TA贡献1891条经验 获得超3个赞

您的问题是结果getDataPoint是 a DataPoint,它只有一种方法可用:Create。然后,您尝试将其用作特定的结构类型,顺便提供所有元数据字段。

你可以让你的 DataPoint 接口提供一个MetaData函数或类似的东西,或者在字段上提供单独的 getter。如果MetaData类型实现了这些方法,当它们作为接口本身呈现时,它们将可以从任一特定结构中获得。


查看完整回答
反对 回复 2021-11-22
?
Qyouu

TA贡献1786条经验 获得超11个赞

您的函数 getDataPoint 返回一个接口,而不是一个结构。因此,如果要将其返回值用作结构体,则必须先进行类型断言。这是一个工作代码:https : //play.golang.org/p/5lx4BLhQBg


查看完整回答
反对 回复 2021-11-22
  • 3 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

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