gpt4 book ai didi

go - 在 Go 中使用元编程解析网络协议(protocol)

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:26 32 4
gpt4 key购买 nike

在 JavaScript (Node) 中,我编写了一个模块,它接受一个字段列表及其类型,并返回一个带有 packunpack 方法的对象。下面是打包和解包 IPv4 的代码:

var ipv4 = proto.add('struct', {
name: 'IPV4',
fields: {
version: 'int:4',
ihl: 'int:4',
dscp: 'int:6',
ecn: 'int:2',
length: 'int:16',
id: 'int:16',
flags: 'int:3',
offset: 'int:13',
ttl: 'int:8',
protocol: 'int:8',
checksum: 'int:16',
src: 'IPV4_ADDR',
dst: 'IPV4_ADDR',
// TODO: IPv4 OPTIONS
options: 'raw'
},
$length: 'length'
});
//then I can do
ipv4.pack({ version: 4, ... }); //=> buffer
//and
ipv4.unpack(buffer); //=> { ... }

由于 JavaScript 是动态的,我可以元编程(合理地)优化 packunpack 函数。据我了解,您不能在 Go 中动态创建函数,尽管使用 reflect 包似乎可以做到这一点。这值得追求吗?还是使用 reflect 成本太高?

我希望避免写 code like this对于我希望解析的每个网络协议(protocol)。

最佳答案

如果可以接受半动态解决方案,您可以从众多专为提高速度而设计的 Golang JSON 替代包中获得灵感。他们的方法是标记一个结构,然后运行一个工具(例如,作为 make 配置的一部分)为所需类型生成 MarshalJSONUnmarshalJSON 方法。这显然比使用标签更快。

一些可以帮助你的例子:

关于go - 在 Go 中使用元编程解析网络协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25156204/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com