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

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
}
- 2 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報