第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

從同一函數(shù)返回接口的不同專門實(shí)現(xiàn)

從同一函數(shù)返回接口的不同專門實(shí)現(xiàn)

Go
函數(shù)式編程 2021-11-22 10:40:12
我有一些類似的數(shù)據(jù)結(jié)構(gòu),每個(gè)數(shù)據(jù)結(jié)構(gòu)都有一些獨(dú)特的字段。它們都實(shí)現(xiàn)了相同的行為接口 (DataPoint)。因此,它們的處理可以在交換每個(gè)結(jié)構(gòu)的類型并通過接口中定義的方法對(duì)其進(jìn)行操作的同時(shí)完成一次。我想讓一個(gè)函數(shù)根據(jù)某些標(biāo)準(zhǔn)返回每種類型的空數(shù)據(jù)結(jié)構(gòu)。但是,我似乎無(wú)法編譯它,好像我的函數(shù)通過簽名返回接口但實(shí)際上返回了一個(gè)實(shí)現(xiàn),它抱怨。這是我的意思的簡(jiǎn)化示例和操場(chǎng)示例: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)}編譯產(chǎn)生: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貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊

如果沒有類型斷言,您將無(wú)法訪問這樣的字段。您只能在接口上調(diào)用方法,它對(duì)其實(shí)現(xiàn)細(xì)節(jié)一無(wú)所知。如果確實(shí)需要訪問這些字段,請(qǐng)使用類型斷言:


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()

游樂場(chǎng):https : //play.golang.org/p/Ije8hfNcWS。


查看完整回答
反對(duì) 回復(fù) 2021-11-22
?
萬(wàn)千封印

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊

您的問題是結(jié)果getDataPoint是 a DataPoint,它只有一種方法可用:Create。然后,您嘗試將其用作特定的結(jié)構(gòu)類型,順便提供所有元數(shù)據(jù)字段。

你可以讓你的 DataPoint 接口提供一個(gè)MetaData函數(shù)或類似的東西,或者在字段上提供單獨(dú)的 getter。如果MetaData類型實(shí)現(xiàn)了這些方法,當(dāng)它們作為接口本身呈現(xiàn)時(shí),它們將可以從任一特定結(jié)構(gòu)中獲得。


查看完整回答
反對(duì) 回復(fù) 2021-11-22
?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊

您的函數(shù) getDataPoint 返回一個(gè)接口,而不是一個(gè)結(jié)構(gòu)。因此,如果要將其返回值用作結(jié)構(gòu)體,則必須先進(jìn)行類型斷言。這是一個(gè)工作代碼:https : //play.golang.org/p/5lx4BLhQBg


查看完整回答
反對(duì) 回復(fù) 2021-11-22
  • 3 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)