我正在用gopacket编写自定义层解码器。
LayerA包含一个Type
可以是以下值之一的字段:
- B-only,下一层是LayerB,后面是原始有效载荷
- C-only,下一层是LayerC,后面是原始有效载荷
- BC,下一层是LayerB,然后是LayerC ,然后是原始有效负载
LayerB中没有字段可以用来知道LayerC是否是下一个。LayerB和LayerC解码不依赖于其他层是否存在。
编写LayerA的解码函数的正确方法是什么,因为它知道下一层是什么?
关于使用gopacket自定义层的教程并不多,而且这种情况与那里介绍的基本情况不同。
看来逻辑应该放在LayerA解码函数中,就在调用p.NextDecoder
.
我想到了两种方法来实现这一点:
1.使用闭包
nextDecoder Decoder
向结构LayerB添加一个字段。在LayerA的解码器中,当Type
是C-only时,只需使用LayerC的解码器。否则,创建一个结构LayerB并相应地填充该字段nextDecoder
。然后在闭包中使用这个结构,它将用作下一个解码器。
问题
LayerB的解码逻辑将在LayerA解码函数中(参见下面 Palyground 中的代码)。此外,在注册LayerB时使用哪个解码函数gopacket.RegisterLayer
?
2.有两个单独的层LayerB-C和LayerB-only
LayerB-C下一个解码器将是LayerC
's,LayerB-only将只是有效载荷层。
问题
LayerB-only和LayerB-C的解码功能是一样的,除了调用p.NextDecoder
. 由于 go 中没有“继承”的概念,我不确定如何设计它以避免重复。也许创建一个带有函数的基于LayerB 的接口nextDecoder() LayerType
,并让LayerB-C和LayerB-only实现它?还是嵌入具有功能的类型LayerB-baseDecode
?但他们都感觉不对劲。
代码
以下是每种描述方式的一些代码:https: //play.golang.org/p/N9ZpYqFb16Q。图层的实际内容不相关,除了LayerA.Type
.
这段代码的结果符合预期,但我想知道是否有更好或更惯用的方法。