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

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

Golang接口的正確使用

Golang接口的正確使用

Go
呼啦一陣風 2023-05-22 15:15:46
我是 Go 的新手,遇到了不確定如何解決的情況。我正在編寫一些代碼,這些代碼以原始字節(jié)形式獲取 DNS 數(shù)據(jù)包并返回一個名為 DNSPacket 的結(jié)構(gòu)。該結(jié)構(gòu)如下所示type DNSPacket struct {    ...some fields    Questions  []Question    Answers    []Answer    ...some more fields}我遇到的問題是 Answers 類型,看起來像這樣。 type Answer struct {    Name     string    Type     int    Class    int    TTL      uint32    RdLength int    Data     []byte}根據(jù) Answer 的類型,Data必須對字段進行不同的解碼。例如,如果答案是一條A記錄(類型 1),則數(shù)據(jù)只是一個 ipv4 地址。但是,如果 Answer 是SRV記錄(類型 33),則數(shù)據(jù)包含port, priority,weight并target在字節(jié)切片中編碼。我認為如果我可以在 Answer 上調(diào)用一個方法,根據(jù)類型返回正確的數(shù)據(jù),那會很棒,DecodeData()但是由于 Go 中沒有覆蓋或繼承,我不確定如何解決這個問題。我嘗試使用接口來解決這個問題,但它無法編譯。我試過類似的東西type DNSRecordType interface {    Decode(data []byte)}type RecordTypeSRV struct {   target string   ...more fields}//to 'implement' the DNSRecordType interfacefunc (record *RecordTypeSRV) Decode(data []byte) {    //do the work to decode appropriately and set    //the fields on the record}然后在 Answer 方法中func (a *Answer) DecodeData() DNSRecordType {    if a.Type === SRVType {       record := RecordTypeSRV{}       record.Decode(a.Data)       return record    }    //do something similar for other record types }具有單一 Answer 類型但能夠根據(jù)其類型返回不同類型的 Answer Data 的正確 Go 方法是什么?抱歉,如果這是一個完全初學者的問題,因為我對 Go 還是很陌生。
查看完整描述

2 回答

?
胡子哥哥

TA貢獻1825條經(jīng)驗 獲得超6個贊

讓我總結(jié)一下你的問題。


您有一個包含答案列表的 DNS 數(shù)據(jù)包。根據(jù)答案的類型,您必須處理答案中的數(shù)據(jù)。


type DNSPacket struct {

    ...some fields

    Questions  []Question

    Answers    []Answer

    ...some more fields

}

type Answer struct {

    Name     string

    Type     int

    Class    int

    TTL      uint32

    RdLength int

    Data     []byte

}

Answer 讓我們創(chuàng)建一個應該實現(xiàn)的接口來處理數(shù)據(jù)。


type PacketProcessor interface {

    Process(Answer)

}

讓 SRV 實現(xiàn) PacketProcessor


type SRV struct {

    ...

}


func (s *SRV) Process(a Answer) {

    ...

}

你的處理邏輯應該如下


func (a *Answer) Process() {

    var p PacketProcessor

    switch a.Type {

        case SRVType:

        p = &SRV{}

        ...

        //other cases

    }


    //finally

    p.Process(*a)

}


查看完整回答
反對 回復 2023-05-22
?
POPMUISE

TA貢獻1765條經(jīng)驗 獲得超5個贊

據(jù)我所知,要返回不同的類型,返回參數(shù)必須是一個接口。所以你可以像這樣簡單地聲明函數(shù):


func (a *Answer) DecodeData() (mode modeType, value interface{}) {}

mode表示值為 A 記錄或 SRV 記錄,您可以使用value字段返回任何您想要的內(nèi)容。


函數(shù)調(diào)用者可以根據(jù)模式處理值


如果你想讓代碼更優(yōu)雅,你可以為每個模式定義不同的值結(jié)構(gòu)。然后調(diào)用者可以如下操作:


type modeType int


const (

    ARecord modeType = 1

    SRVRecord modeType = 2

)


switch mode {

    case ARecord:

    // do something

    case SRVRecord:

    // do something


查看完整回答
反對 回復 2023-05-22
  • 2 回答
  • 0 關(guān)注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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