有没有办法将Go可执行文件分成几个文件?

Buz*_*zzy -3 go

我正在发送几个用Go编译的可执行文件.每个可执行文件本身不包含大量代码,但每个可执行文件都使用包含日志记录,配置管理,通信层等的公共库.

这导致每个可执行文件在15-20mb之间,有时只有1000行代码.

Go中是否有一种方法(目前可用或计划用于将来的版本),允许将应用程序分成几个文件(即Windows中的dll,.so Linux/Mac)?

我知道我可以编译库然后将其用作外部二进制文件但是我不会从类型系统和Go编译器优化中获益.我错了,有办法吗?

syn*_*aqx 5

简短的回答:那种?

听起来你想要完成的是一个共享库.

Go编译器已经能够使用-buildmode=c-sharedbuild标志生成1.5以来的共享库:

go build -o helloworld.so -buildmode=c-shared
Run Code Online (Sandbox Code Playgroud)

而且,从Go 1.10开始,Windows还支持该功能

因此,编译为DLL也是一个单行:

go build -o helloworld.dll -buildmode=c-shared
Run Code Online (Sandbox Code Playgroud)

您将遇到的问题实际上是使用这些库,尤其是在跨操作系统方式中:

在*nix中,您可以使用CGO来完成此任务:

package example

// #cgo LDFLAGS: -lfoo
//
// #include <foo.h>
import "C"

func main() {
    C.bar()
}
Run Code Online (Sandbox Code Playgroud)

Windows获得了自己的Wiki(谁感到惊讶?).

我会给你留下一些想法:

  1. 什么错用15-20mb二进制(虽然,你应该尝试UPX剃掉了一些脂肪,因为为什么不呢?),那么当你推演出数百的10S关注.这些天太空了.
  2. 写一些可以编译成单个二进制文件的东西,无论操作系统如何,都是Go的最佳特权之一.
  3. CGO_ENABLED=0从二进制文件中节省大量空间.保持启用(您需要使用这些功能),对您没有任何好处.
  4. 您可以认为,由于编译器无法针对包含的库进行优化,因此在小用例中最终您不会节省太多(如果有空间).

我的最后一点,然后我会停止向你讲道:专注于编写代码.除非您尝试使用嵌入式设备,否则不应该考虑二进制大小.

祝你好运的朋友.