关于 golang build
如何编译
golang 的编译还是比较容易的,用法如下:
go build [-o output] [-i] [build flags] [packages]
上面方括号标记的参数,都可以没有……
最简的操作就是直接 go build ,这样操作会直接找到当前文件夹下的 main 包,并编译之。
比较常用的就是 -o 了,指定输出文件,比如:
go build -o 666 main.go
此时会将 main.go 编译为二进制文件666(windows下会输出成 666.exe)
go 是支持交叉编译的,请参见 golang开发环境配置备忘
更多设置
具体操作可以参考命令说明,在你的命令行输入 go help build 查看细节。
我在这列举若干
缩小输出文件体积
go 编译出的文件,实话说体积挺大的。一个重要原因是其中包含了调试信息,我们可以通过编译参数使其不包含调试信息,这样输出的体积会小一些。
# 移除 调试信息(-w) 和 符号表(-s)
go build -o main -ldflags "-w -s" main.go
上述操作使用 -ldflags 参数指定 -w 和 -s, 分别表示在编译时不包含调试信息和符号表,此举可以较好地缩减二进制文件体积。
编译时写入全局变量
go 可以通过编译参数,在编译时对变量进行赋值。一般情况下,这种操作可以让程序保留编译信息等数据。
通过 -ldflags 参数,设定 -X 操作,可以为全局变量赋值。
试举一例:
源码如下
package main
import "fmt"
var BuildTime = "now"
func main() {
fmt.Printf("BuildTime: %s\n", BuildTime)
}
定义全局变量BuildTime并在主程序中输出。
$ go run main.go
BuildTime: now
$ go build -ldflags "-X 'main.BuildTime=time006'" main.go
$ ./main
BuildTime: time006
$ go build -ldflags "-X 'main.BuildTime=`date`'" main.go
$ ./main
BuildTime: Sun 29 Sep 2019 10:14:47 PM CST
上面分别演示了,直接运行源码,编译加参数运行的效果。第三个示例表示,使用 -X 对全局变量进行编译时赋值,甚至可以将命令结果赋予全局变量。
所以通常我们会这么做:
package main
import "fmt"
var BuildTime = ""
var GitHash = ""
func main() {
fmt.Printf("BuildTime: %s\n", BuildTime)
fmt.Printf("Git Hash: %s\n", GitHash)
}
分别定义 BuildTime 编译时间和 GitHash git的commit hash。在合适的时候输出,以方便地区分版本。并使用如下编译命令:
go build -ldflags "-X 'main.BuildTime=`date`' -X 'main.GitHash=`git rev-parse HEAD`'" main.go
最后,编译后的程序会有类似如下输出:
$ ./main
BuildTime: Sun 29 Sep 2019 10:29:36 PM CST
Git Hash: 9a80ee05b16e0aa90e6e0b690c7da8686fd102a0
这样就能知道编译后的二进制文件版本是什么了。
其它
其它内容,想到再补充。
原文发布于:https://moonlightwatch.me/%E5%BC%80%E5%8F%91%E9%9A%8F%E7%AC%94/27.html
关于 golang build的更多相关文章
- sublime text3 golang插件(golang build)
1 前言 先前条件: sublime text3:下载地址:http://www.sublimetext.com/3 golang:下载地址:https://golang.google.cn/dl/ ...
- golang build 的简单用法.(菜鸟初学)
1. golang 里面的 go build 可以编译代码. go build helloworld.go 2. 这里面有一个注意事项事项. 如果引用非go语言的 内置package的话 需要在环境变 ...
- Golang build命令解析
go build,是我们非常常用的命令,它可以启动编译,把我们的包和相关的依赖编译成一个可执行的文件. usage: go build [-o output] [-i] [build flags] [ ...
- golang build 编译规则
文章来源: http://blog.csdn.net/varding/article/details/12675971 讲述了golang中的条件编译,摘要如下: 第一种条件编译的方法:编译标签 编译 ...
- golang build error: syntax error: nested func not allowed
在笔记本中写了一个简易web程序,但是编译失败,提示“syntax error: nested func not allowed” . 不明白什么意思,幸好代码量小,原来是方法的末尾的“}”丢了! p ...
- 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误
编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...
- golang使用sqlite
安装问题 在import sqlite的时候,golang build 出现以下错误, exec: "gcc": executable file not found in %PAT ...
- CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中
CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28. 编写了个golang程序,用到了这个C ...
- Golang资料集
<Platform-native GUI library for Go> 介绍:跨平台的golang GUI库,支持Windows(xp以上),Unix,Mac OS X(Mac OS X ...
随机推荐
- uni-app常用 HTML5+APP 设置
1.锁定屏幕方向 锁定屏幕方向后屏幕只能按锁定的屏幕方向显示,关闭当前页面后仍然有效. 可再次调用此方法修改屏幕锁定方向或调用 unlockOrientation() 方法恢复到应用的默认值. 锁定屏 ...
- 中文版Postman测试需要登陆才能访问的接口(基于Cookie)
ApiPost堪称增强版的中文postman,是一个支持团队协作,并可直接生成文档的API调试.管理工具.它支持模拟POST.GET.PUT等常见请求,是后台接口开发者或前端.接口测试人员不可多得的工 ...
- maven 学习---Maven安装配置
想要安装 Apache Maven 在Windows 系统上, 只需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量. 所需工具 : JDK 1.8 ...
- MySQL 加锁和死锁解析
目录 产生死锁的必要条件 锁是加在那里的? 操作与加锁的对照关系 Insert Delete Update GAP锁 什么时候加next-key lock? Insert Intention Lock ...
- 工作不久的安卓开发者,他们是这样规划自己的Android学习路线
Android开发工作者工作不久的时候,会有一段迷茫期,觉得自己应该再学一点,却不知道从何学起,该怎样规划自己的学习路线呢?今天,我给大家梳理一下Android基础,就像建造房屋一样,要建造一座宏伟的 ...
- dedecms去掉标题长度限制
dedecms文章标题默认显示字数为60字节(30个汉字),如果想要显示更多要如何操作呢?两步解决问题,随ytkah一起来看看吧.1.后台找到“系统设置-系统基本参数-其他其他选项”(如下图)这时你可 ...
- 使用Git管理品优购项目 开始部分
- DB2数据库
必需步骤: 您已经启用了 DB2 扩展 Windows 安全性.您必须将运行 DB2 本地应用程序或工具的 DB2 用户添加至 DB2ADMNS 或DB2USER 组 可以使用端口号 "50 ...
- Jupyter-notebook安装问题及解决
两种方式: 1.pip install jupyter notebook 2.安装Anaconda 1.pip安装 通过命令行pip,要注意是在哪个虚拟环境,安装好后jupyter notebook所 ...
- java信号量
维基百科解释的信号量概念如下 信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值.当线程完成一次对该semaphore对象的等待(wait)时,该 ...