Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 当NextDecoder依赖于上一层而不是当前层时,如何正确编写自定义层?_Go_Gopacket - Fatal编程技术网

Go 当NextDecoder依赖于上一层而不是当前层时,如何正确编写自定义层?

Go 当NextDecoder依赖于上一层而不是当前层时,如何正确编写自定义层?,go,gopacket,Go,Gopacket,我正在用gopacket编写自定义层解码器 LayerA包含一个字段Type,该字段可以是以下值之一: 仅B,下一层是层B,后面是原始有效负载 仅限C,下一层为LayerC,后跟原始有效负载 B-C,下一层是LayerB,然后是LayerC,然后是原始有效载荷 LayerB中没有字段可用于知道LayerC是否是下一个LayerB和LayerC解码不取决于是否存在另一层 写LayerA解码函数的正确方法是什么,因为它知道下一层是什么 关于gopacket的自定义层的教程并不多,本例也不同于这里

我正在用gopacket编写自定义层解码器

LayerA包含一个字段
Type
,该字段可以是以下值之一:

  • 仅B,下一层是层B,后面是原始有效负载
  • 仅限C,下一层为LayerC,后跟原始有效负载
  • B-C,下一层是LayerB,然后是LayerC,然后是原始有效载荷
LayerB中没有字段可用于知道LayerC是否是下一个LayerBLayerC解码不取决于是否存在另一层

LayerA解码函数的正确方法是什么,因为它知道下一层是什么

关于gopacket的自定义层的教程并不多,本例也不同于这里介绍的基本教程

似乎在调用
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-CLayerB-only实现它?或者嵌入一个具有解码功能的类型LayerB base?但他们两个都觉得不对

代码 下面是描述的每种方法的一些代码:。层的实际内容不相关,除了
LayerA.Type


这段代码的结果与预期的一样,但我想知道是否有更好或更惯用的方法来实现这一点。

您可以通过将下一层声明为接口来实现,该接口可以支持B或C。只要您声明的内容符合LayerType,这应该可以很好地工作。

您可以通过将下一层声明为接口来实现这一点,接口可以支持B或C。只要您声明的内容适合作为LayerType,这应该可以很好地工作。

这听起来很像您描述的是负载属于
LayerA的系统,
LayerB
LayerC
是该层的可选标题,而不是新的封装级别。这可能只是因为你在这里提出的问题的简化版本。嗨@JamesHenstridge,啊,是的,将它们视为可选标题是有意义的!我认为是这样的,因为只有LayerA知道他们的存在。谢谢,这将简化结构!听起来很像您描述的系统,其中负载属于
LayerA
,而
LayerB
LayerC
是该层的可选头,而不是新的封装级别。这可能只是因为你在这里提出的问题的简化版本。嗨@JamesHenstridge,啊,是的,将它们视为可选标题是有意义的!我认为是这样的,因为只有LayerA知道他们的存在。谢谢,这将简化结构!