Go 当NextDecoder依赖于上一层而不是当前层时,如何正确编写自定义层?
我正在用gopacket编写自定义层解码器 LayerA包含一个字段Go 当NextDecoder依赖于上一层而不是当前层时,如何正确编写自定义层?,go,gopacket,Go,Gopacket,我正在用gopacket编写自定义层解码器 LayerA包含一个字段Type,该字段可以是以下值之一: 仅B,下一层是层B,后面是原始有效负载 仅限C,下一层为LayerC,后跟原始有效负载 B-C,下一层是LayerB,然后是LayerC,然后是原始有效载荷 LayerB中没有字段可用于知道LayerC是否是下一个LayerB和LayerC解码不取决于是否存在另一层 写LayerA解码函数的正确方法是什么,因为它知道下一层是什么 关于gopacket的自定义层的教程并不多,本例也不同于这里
Type
,该字段可以是以下值之一:
- 仅B,下一层是层B,后面是原始有效负载
- 仅限C,下一层为LayerC,后跟原始有效负载
- B-C,下一层是LayerB,然后是LayerC,然后是原始有效载荷
p.NextDecoder
之前,逻辑应该放在LayerA解码函数中
我想到了两种方法来实现这一点:
1.使用闭包
将字段nextDecoder解码器
添加到结构LayerB。
在LayerA的解码器中,当Type
仅为C-时,只需使用LayerC的解码器即可。否则,创建一个structLayerB并相应地填充字段nextDecoder
。然后在闭包中使用此结构,它将用作下一个解码器
问题
LayerB的解码逻辑将在LayerA解码功能中(参见下面的Palyground中的代码)。
此外,当使用gopacket.RegisterLayer
注册层b时,要使用哪个解码功能
2.只有LayerB-C和LayerB两个单独的层
LayerB-C下一个解码器将是LayerC
,LayerB-only将只是有效负载层
问题
除了调用p.NextDecoder
外,仅LayerB的解码功能与LayerB-C的解码功能相同。
由于go中没有“继承”的概念,我不确定如何设计它以避免重复。也许可以使用函数nextDecoder()LayerType
创建一个LayerB-base接口,并使LayerB-C和LayerB-only实现它?或者嵌入一个具有解码功能的类型LayerB base?但他们两个都觉得不对
代码
下面是描述的每种方法的一些代码:。层的实际内容不相关,除了LayerA.Type
这段代码的结果与预期的一样,但我想知道是否有更好或更惯用的方法来实现这一点。您可以通过将下一层声明为接口来实现,该接口可以支持B或C。只要您声明的内容符合LayerType,这应该可以很好地工作。您可以通过将下一层声明为接口来实现这一点,接口可以支持B或C。只要您声明的内容适合作为LayerType,这应该可以很好地工作。这听起来很像您描述的是负载属于
LayerA的系统,LayerB
和LayerC
是该层的可选标题,而不是新的封装级别。这可能只是因为你在这里提出的问题的简化版本。嗨@JamesHenstridge,啊,是的,将它们视为可选标题是有意义的!我认为是这样的,因为只有LayerA知道他们的存在。谢谢,这将简化结构!听起来很像您描述的系统,其中负载属于LayerA
,而LayerB
和LayerC
是该层的可选头,而不是新的封装级别。这可能只是因为你在这里提出的问题的简化版本。嗨@JamesHenstridge,啊,是的,将它们视为可选标题是有意义的!我认为是这样的,因为只有LayerA知道他们的存在。谢谢,这将简化结构!