Go Build Flags
                    目录
                    
                
                
            
                    警告
                
                
                        本文最后更新于 2021-01-13,文中内容可能已过时。
                ldflags
ldflags用于将标志传递给编译器链接器(ld)。
- -s: 去掉符号表信息,减小可执行文件的大小。
 - -w: 去掉DWARF调试信息,减小可执行文件的大小。
 - -X: 设置字符串变量,用于编译时注入程序版本等信息。例如,-X main.version=1.0.0
 - -H: 设置堆的大小。例如,-H=0 表示禁用堆。
 - -extldflags: 用于将标志传递给链接器。
 
在构建时设置一个环境变量
一个非常方便的构建标志,允许你在构建时从命令行设置一个变量。看下面的例子。
 | 
 | 
使用默认值我们得到以下结果。
 | 
 | 
通过添加-X链接器标志,我们可以在编译时改变who。这只是一个愚蠢的例子,但这对于在编译时更新二进制文件的版本信息很有用。
 | 
 | 
symbol table可以使用go tool nm命令查看。只需将可执行文件、对象文件或存档的名称传递给它。让你自己更轻松,只需在输出中寻找你的变量即可。
 | 
 | 
缩小你的Go二进制
go的版本为1.15.6,有原来的2M压缩成了1.4M。
我们可以用以下标志省略symbol table、调试信息和DWARF表。可以用以下标志省略: -s -w
 | 
 | 
最好的可执行文件打包器之一是UPX。它使用起来非常简单。我用-9运行它,以速度为代价获得最大的压缩。
 | 
 | 
没有控制台窗口的Windows可执行文件
我觉得当我运行一个exe时,打开一个控制台窗口很不美观,而且我不需要看到任何输出。
只要在你的链接器标志中添加"-H=windowsgui"。控制台窗口消失了。欢迎你。
 | 
 | 
gcflags
- -N: 禁用优化。使用这个标记编译程序时,将禁用所有优化,这对于调试程序非常有用。
 - -l: 关闭内联编译器。通过这种方式可以控制内联编译器的行为,但是要注意关闭内联编译器可能会导致性能问题。
 - -m: 打印内存分配的信息,包括在哪里发生了内存分配以及分配的类型。
 - -B: 设置最大的过程编译器的字节数。
 - -S: 将汇编代码打印到标准输出中。这对于调试优化程序非常有用,可以让开发人员更好地理解程序中发生了什么。
 
 | 
 | 
使用案例
go build -gcflags="-N -l": 禁止优化,禁止内联go build -gcflags="-m -l": 观察内存逃逸