我正在用 gopacket 编写自定义层解码器。
LayerA 包含字段Type
,该字段可以是以下值之一:
LayerB 中没有可用于了解 LayerC 是否为下一个字段的字段。 LayerB 和 LayerC 解码与是否存在其他层无关。
编写 LayerA 的解码功能的正确方法是什么,因为它是知道下一层是什么的方法?
关于 gopacket 的自定义层的教程并不多,这种情况与此处介绍的基本层不同。
似乎应该在调用p.NextDecoder
之前将逻辑放在 LayerA 解码函数中。
我想到了两种实现方法:
将字段nextDecoder Decoder
添加到结构 LayerB 。
在 LayerA 的解码器中,当Type
仅限于 C 时,只需使用 LayerC 的解码器。否则,创建一个结构 LayerB ,并相应地填充字段nextDecoder
。然后在闭包中使用此结构,该闭包将用作下一个解码器。
LayerB 的解码逻辑将在 LayerA 解码功能中(请参见下面Palyground中的代码)。
此外,在向gopacket.RegisterLayer
注册 LayerB 时要使用哪种解码功能?
LayerB-C 的下一个解码器将是LayerC
,仅LayerB 的将是有效负载层。
仅 LayerB 和 LayerB-C 的解码功能相同,期望调用p.NextDecoder
。
既然没有“继承”的概念,我不确定如何设计以避免重复。也许使用功能nextDecoder() LayerType
创建基于LayerB的接口,并实现 LayerB-C 和 LayerB-only ?还是嵌入具有功能Decode
的 LayerB-base 类型?但是他们两个都不对。
以下是每种描述方式的一些代码:https://play.golang.org/p/N9ZpYqFb16Q。除LayerA.Type
之外,各层的实际内容均无关。
此代码的结果符合预期,但我想知道是否有更好或更惯用的方法。
答案 0 :(得分:0)
您可以通过将下一层声明为可以支持B或C的接口来做到这一点。只要声明的内容适合LayerType,就可以正常工作。