Golang 的静态编译

Python016

Golang 的静态编译,第1张

Go 语言和 C 语言的一个很大的区别是, Go 语言只静态编译,做个测试:

一方面是 Go 语言编译后的可执行文件大小比 C 语言的大很多,

另一方面是 C 语言的可执行文件需要依赖 glibc 动态库,

用 ldd 命令可以看出来:

或者直接删除 glibc 动态库, C 可执行程序报错,而 Go 的还能运行:

这时候只有内部命令可以运行,外部命令,包括 ln 甚至最常用的 ls 命令也不能运行了:

设置好 LD_PRELOAD 环境变量之后, ln 命令可以运行,但是 sudo 仍然不能运行

只能靠 root 用户来重新创建软连接了:

所以用 sudo 来 rm 文件要小心,还是用 root 比较好。如果没有预先留一个打开的 root 终端,登录都登不进去。

golang保存二进制文件会有大小端问题。

这个二进制文件的确有Big Endian 和Little Endian的问题,这个与CPU指令体系有关,不过不用操心,像JPEG就是Big Endian,其编解码就都是按照这个约定来完成的,没有平台问题,也没有大小端的问题。

编译centos上的可执行文件的时候需要交叉编译。golang的交叉编译很容易,你的情况的话用下面这条命令,GOOS=linux GOARCH=amd64 go build ./文件。

golang描述:

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础。

采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。

与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。