【发布时间】:2018-12-25 11:28:52
【问题描述】:
我是 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
}
根据答案的类型,Data 字段的解码方式必须不同。例如,如果答案是 A 记录(类型 1),则数据只是一个 ipv4 地址。但是,如果答案是 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
}
拥有单一答案类型但能够根据其类型返回不同类型的答案数据的正确 Go 方式是什么? 抱歉,如果这是一个完全初学者的问题,因为我对 Go 还是很陌生。
谢谢!
【问题讨论】:
-
一般这种事情是用Discriminated Union来完成的,但是我不知道Go中有没有这样的事情。