如何编译

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的更多相关文章

  1. sublime text3 golang插件(golang build)

    1 前言 先前条件: sublime text3:下载地址:http://www.sublimetext.com/3 golang:下载地址:https://golang.google.cn/dl/ ...

  2. golang build 的简单用法.(菜鸟初学)

    1. golang 里面的 go build 可以编译代码. go build helloworld.go 2. 这里面有一个注意事项事项. 如果引用非go语言的 内置package的话 需要在环境变 ...

  3. Golang build命令解析

    go build,是我们非常常用的命令,它可以启动编译,把我们的包和相关的依赖编译成一个可执行的文件. usage: go build [-o output] [-i] [build flags] [ ...

  4. golang build 编译规则

    文章来源: http://blog.csdn.net/varding/article/details/12675971 讲述了golang中的条件编译,摘要如下: 第一种条件编译的方法:编译标签 编译 ...

  5. golang build error: syntax error: nested func not allowed

    在笔记本中写了一个简易web程序,但是编译失败,提示“syntax error: nested func not allowed” . 不明白什么意思,幸好代码量小,原来是方法的末尾的“}”丢了! p ...

  6. 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误

    编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...

  7. golang使用sqlite

    安装问题 在import sqlite的时候,golang build 出现以下错误, exec: "gcc": executable file not found in %PAT ...

  8. CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中

    CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28. 编写了个golang程序,用到了这个C ...

  9. Golang资料集

    <Platform-native GUI library for Go> 介绍:跨平台的golang GUI库,支持Windows(xp以上),Unix,Mac OS X(Mac OS X ...

随机推荐

  1. Gin-Go学习笔记二:Gin-Web框架

    Gin-Web框架 1>     首先声明,这个是我自己搭建的纯Gin-Web框架,其中有借鉴学习别的想法和代码.已上传到GitHub上.地址为: https://github.com/weiy ...

  2. 78.3D立体轮播图(完整兼容手机端和pc端)

    效果呈现来源于http://www.jq22.com/demo/jR3DCarousel-master20160315/ 在此基础上改成需要的3个分类的3D图 由于原有的不支持粘贴复制显示3个分类 我 ...

  3. QT POST/GET HTTP操作

    工程文件 Qt += network 举例 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui-> ...

  4. 深入理解Java封装、继承、多态

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830957.html 一:封装 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法 ...

  5. 使用docker创建mongodb

    1.创建 MongoDB 数据卷 docker volume create mongo_data_yapi 2.启动 MongoDB docker run -d --name mongo-yapi - ...

  6. oracle 导入导出表

    imp username/pwd@orcl file=c:\temp\exp.dmp tables=(table1, table2)#imp username/pwd@ip:1521/orcl ful ...

  7. 用肘方法确定 kmeans 聚类中簇的最佳数量

    说明: KMeans 聚类中的超参数是 K,需要我们指定.K 值一方面可以结合具体业务来确定,另一方面可以通过肘方法来估计.K 参数的最优解是以成本函数最小化为目标,成本函数为各个类畸变程度之和,每个 ...

  8. helm搭建本地chart仓库及基本操作

    这个步骤,是配合公司的竞赛. 因为公司这次的环境,我们只有namespace权限,而没有整个集群的管理, 而且,公司没有提供统一的helm chart repo, 所以只能自建. 参考URL: htt ...

  9. 使用WIFI准备工作及配置内核——韦东山

    主要做的工作:让内核如何支持现有的无线网卡.知道这个流程就可以了,没必要深究. 使用WIFI功能时,涉及两个东西: 同样手机也可以用于WIFI AP模式,让别的设备来连接它.就是我们平时所说的用手机开 ...

  10. jquery 统计统计子标签的个数

    本文实例讲述了jQuery获得子元素个数的方法.分享给大家供大家参考.具体分析如下://获取id=div1下的子元素的个数$('#div1').children().length;//获取id=div ...