亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從同一函數返回接口的不同專門實現

從同一函數返回接口的不同專門實現

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 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號