我是 Go 的新手,遇到了不确定如何解决的情况。我正在编写一些代码,这些代码以原始字节形式获取 DNS 数据包并返回一个名为 DNSPacket 的结构。
该结构如下所示
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
}
根据 Answer 的类型,Data必须对字段进行不同的解码。例如,如果答案是一条A记录(类型 1),则数据只是一个 ipv4 地址。但是,如果 Answer 是SRV记录(类型 33),则数据包含port, priority,weight并target在字节切片中编码。
我认为如果我可以在 Answer 上调用一个方法,根据类型返回正确的数据,那会很棒,DecodeData()但是由于 Go 中没有覆盖或继承,我不确定如何解决这个问题。我尝试使用接口来解决这个问题,但它无法编译。我试过类似的东西
type DNSRecordType interface {
Decode(data []byte)
}
type RecordTypeSRV struct {
target string
...more fields
}
//to 'implement' the DNSRecordType interface
func (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 类型但能够根据其类型返回不同类型的 Answer Data 的正确 Go 方法是什么?抱歉,如果这是一个完全初学者的问题,因为我对 Go 还是很陌生。
胡子哥哥
POPMUISE
相关分类