猿问

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

我有一些类似的数据结构,每个数据结构都有一些独特的字段。它们都实现了相同的行为接口 (DataPoint)。因此,它们的处理可以在交换每个结构的类型并通过接口中定义的方法对其进行操作的同时完成一次。我想让一个函数根据某些标准返回每种类型的空数据结构。但是,我似乎无法编译它,好像我的函数通过签名返回接口但实际上返回了一个实现,它抱怨。


这是我的意思的简化示例和操场示例:


https://play.golang.org/p/LxY55BC59D


package main


import "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)


函数式编程
浏览 152回答 3
3回答

湖上湖

如果没有类型断言,您将无法访问这样的字段。您只能在接口上调用方法,它对其实现细节一无所知。如果确实需要访问这些字段,请使用类型断言:dpc := getDataPoint("Conversion")dpc.(*Conversion).Meta = metadpc.(*Conversion).Value = 100dpc.Create()dpi := getDataPoint("Impression")dpi.(*Impression).Meta = metadpi.(*Impression).Count = 42dpi.Create()游乐场:https : //play.golang.org/p/Ije8hfNcWS。

万千封印

您的问题是结果getDataPoint是 a DataPoint,它只有一种方法可用:Create。然后,您尝试将其用作特定的结构类型,顺便提供所有元数据字段。你可以让你的 DataPoint 接口提供一个MetaData函数或类似的东西,或者在字段上提供单独的 getter。如果MetaData类型实现了这些方法,当它们作为接口本身呈现时,它们将可以从任一特定结构中获得。

Qyouu

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

相关分类

Go
我要回答