【问题标题】:Embed Go struct data into binary将 Go 结构数据嵌入二进制文件
【发布时间】:2018-02-24 16:29:56
【问题描述】:

我有数百条元数据记录可供我的 Go 程序使用。我希望将数据编译成二进制文件,这样它就可以正常工作,避免依赖于要运行的其他文件。

元数据以 csv 开头,我还有一个将 csv 处理为结构的包。主程序通过导入该包来使用这些结构。 csv 只是偶尔更改。

我学会了如何将结构导入和导出为 gobs,但我需要将这些 gob 存储在一个文件(等)中并在运行时加载它们。

我考虑制作共享库,但它们是 ELF 格式,似乎不支持我需要的本机 Go 结构。

我可以让 csv-processing 包从字面上打印出 go 代码来重新创建这些结构实例(比如说一个 base64 编码的 gob),用主程序构建,但这似乎是一种非常迂回的方式去吧。

有没有一种简单的方法可以将这个准备好的结构数据嵌入到我的二进制文件中?

【问题讨论】:

  • 这不是一个非常迂回的方法。这历史悠久的直截了当的方法。
  • 我唯一的建议是不要使用 base64。那只会让你的二进制文件膨胀。使用十六进制文字。这将使您的源代码更大,但谁在乎呢,因为它是您不应该阅读的生成源。然后编译后的版本会更小,执行起来也更快(因为不需要 base64 解码)。
  • 它可能是历史悠久的最佳选择,但它绝对不是直截了当的。最困扰我的部分是虽然 gob 是“自描述​​的”,但接收类型仍然需要定义,所以我必须维护两个单独的副本。我想我可以跨包进行符号链接。
  • 我认为历史悠久的方式不包括吞噬。如果这样做,您也可以将原始 csv 作为字符串嵌入到源代码中。常见的做法是生成结构文字。
  • csv 需要一些处理,而且它很少改变,所以当你可以做一次(至少在这种情况下)时,每次运行都必须这样做是没有意义的。

标签: go


【解决方案1】:

有一些包可以将资源(二进制文件)嵌入到您的应用中。

我正在使用以下内容:

  • 我选择go-resources 用于生产。它会生成包含您的数据为十六进制编码的 go 源代码文件;
  • 另一个有用的包:go.rice - 真正将您的数据作为资源嵌入到可执行文件中。但是我在跨平台构建方面遇到了一些问题;

我找到了执行相同任务的软件包,但我没有在生产中使用它:

【讨论】:

  • 这些都可能是答案的部分,但它们都处理任意数据,而不是本机 Go 类型,这是我想保留的。
  • 关于 Rice 将压缩数据附加到可执行文件的部分很有趣,但几乎所有关于它的信息都是关于 windows 的。
  • @carilonator 您试图使用 gobs 来取消/序列化数据。这是从存储在本地磁盘上的外部文件加载数据的好方法。 Golang 没有一种方法可以像 C/C++ 那样加载数据,就像准备好处理原始数据一样。
  • 您可以使用以下步骤:以 gobs 格式准备数据,然后使用标记的开发时间文件,例如,负标签“embed” // +build !embed 从在开发过程中使用本地磁盘,然后使用go-resources生成标记为“embed”的go文件并加载数据,使用方法与从磁盘加载数据相同。
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多