编译器已经做到了。所有代码都以包文件(
.a)结尾,但是在可执行二进制文件中,Go工具并不包括导入包中的所有内容,仅包括所需的内容(或更确切地说,它排除了可能无法访问的内容)。
这里要注意的一件事:如果一个导入的包(您只想从中包含您所引用的内容)导入了其他包,那么这当然必须递归地完成。
例如,如果您导入此程序包:
package subplayfunc A() {}并从中调用任何内容:
package mainimport _ "play/subplay"func main() {}结果二进制文件(Go 1.8,linux,amd64)将为960,134字节(大约1 MB)。
如果更改
subplay为导入
net/http:
package subplayimport _ "net/http"func A() {}但是仍然不要从中调用任何内容
net/http,结果将是: 5,370,935字节 (大约5
MB)!(请注意,
net/http还要导入其他39个软件包!)
现在,如果您开始使用以下内容
net/http:
package subplayimport "net/http"func A() { http.ListenAndServe("", nil)}但是在
main程序包中您仍然不调用
subplay.A(),可执行二进制文件的大小 不会改变:仍然为5,370,935字节 !
当您将
main包更改为call时
subplay.A():
package mainimport "play/subplay"func main() { subplay.A()}结果二进制数 增长:5,877,919字节 !
如果更改
http.ListenAndServe()为
http.ListenAndServeTLS():
func A() { http.ListenAndServeTLS("", "", "", nil)}结果二进制为: 6,041,535字节 。
如您所见,编译到可执行二进制文件中的内容 确实取决于您 从导入包中 调用/使用 的内容。
同样不要忘记Go是一种静态链接的语言,结果可执行二进制文件必须包含它需要的所有内容。



