Golang Go语言编译时是否会将第三方库所有函数都编译进去
Golang Go语言编译时是否会将第三方库所有函数都编译进去
引用了一个第三方包, 只用到其中一部分函数,那些没有用到的函数是不是也被编译到静态二进制文件中了?
是的。而且不止 golang,很多方法都是。
更多关于Golang Go语言编译时是否会将第三方库所有函数都编译进去的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
只包含要用到的(不管系统库还是第三库) 没用到的不编译 不信反编译看看
上面两位究竟谁对谁错
不是。在 1.7 版本引入了 method pruning,没有引用和反射的方法将不会被打包。
参见
https://blog.golang.org/go1.7-binary-size
The second change is method pruning. Until 1.6, all methods on all used types were kept, even if some of the methods were never called. This is because they might be called through an interface, or called dynamically using the reflect package. Now the compiler discards any unexported methods that do not match an interface. Similarly the linker can discard other exported methods, those that are only accessible through reflection, if the corresponding reflection features are not used anywhere in the program. That change shrinks binaries by 5–20%.
二楼的是对的,一楼的是错的。
关于函数本身而不是方法。并没有明确的规范说明未使用的函数究竟会不会打包到二进制文件,不过目前验证来看也是会丢弃的,丢弃这个远比方法简单,因为 Go 中函数是不能反射的,直接丢掉就行了。
我感觉好像只有 Java 会这样,其他的「编译型」语言连 js 都有 Tree Shaking 了
那这点比 python 强阿。python 用个第三方包中的某个程序,要把整个包都装一下。
装了后再手动删代码也是可以的[:doge]
作为IT领域Go语言方面的专家,对于Golang编译时是否会将第三方库所有函数都编译进去的问题,以下是我的专业解答:
在Go语言编译过程中,并不会无条件地将第三方库的所有函数都编译进去。Go语言的编译器是智能的,它只会根据项目的实际依赖关系,将需要的函数和方法编译到最终的可执行文件中。
具体来说,当在Go代码中导入了一个第三方库时,只需在import语句中指定该库的路径。Go编译器在编译过程中会解析这些import语句,并根据项目的实际使用情况,决定哪些函数和方法需要被编译。
因此,如果项目中并没有使用到第三方库的所有函数,那么这些未使用的函数就不会被编译到最终的可执行文件中。这种编译方式不仅提高了编译效率,还减少了最终可执行文件的大小。
总的来说,Go语言编译时只会将实际需要的第三方库函数编译进去,而不会无差别地编译所有函数。这种特性使得Go语言在保持高性能的同时,还具有很好的灵活性和可扩展性。