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 关注
- 117 浏览
添加回答
举报