2 回答

TA貢獻1825條經驗 獲得超6個贊
讓我總結一下你的問題。
您有一個包含答案列表的 DNS 數據包。根據答案的類型,您必須處理答案中的數據。
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 讓我們創建一個應該實現的接口來處理數據。
type PacketProcessor interface {
Process(Answer)
}
讓 SRV 實現 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條經驗 獲得超5個贊
據我所知,要返回不同的類型,返回參數必須是一個接口。所以你可以像這樣簡單地聲明函數:
func (a *Answer) DecodeData() (mode modeType, value interface{}) {}
mode表示值為 A 記錄或 SRV 記錄,您可以使用value字段返回任何您想要的內容。
函數調用者可以根據模式處理值
如果你想讓代碼更優雅,你可以為每個模式定義不同的值結構。然后調用者可以如下操作:
type modeType int
const (
ARecord modeType = 1
SRVRecord modeType = 2
)
switch mode {
case ARecord:
// do something
case SRVRecord:
// do something
}
- 2 回答
- 0 關注
- 159 瀏覽
添加回答
舉報