先看效果
$./myapp -v
GitCommitLog=d97d098e5bb4ad38a2a7968f273a256e10a0108f mod bininfo comment
GitStatus=cleanly
BuildTime=2019.10.26.194341
GoVersion=go version go1.13 darwin/amd64
runtime=darwin/amd64
myapp 是一个演示用的 demo 程序,输入 -v
参数运行时,打印出程序的一些信息。以上信息对应的说明如下:
# GitCommitLog
d97d098e5bb4ad38a2a7968f273a256e10a0108f: 源码最近一次 commit 的 sha 值
mod bininfo comment: 源码最近一次 commit 的描述信息
# GitStatus
cleanly: 表示本地代码相对于最近一次 commit,并没有任何修改
如果本地代码有修改,此处会显示修改过的文件
# BuildTime
2019.10.26.194341: 程序的编译时间为2019年10月26号19点43分41秒
# GoVersion
go version go1.13 darwin/amd64: 程序编译使用的 Go 版本为1.13,darwin 即 macos
# runtime
程序运行时的平台,因为 Go 的跨平台编译做的比较好,为了避免混淆,我
们在 GoVersion 打印了编译平台的同时,把运行平台也打印出来
ok,下面就来介绍是如何实现的。
依赖的知识点
Go 语言编译时,可以通过 go build -ldflags
的方式向程序中指定的包中的变量传递值。
拿下面这个十来行的程序做个演示:
package main
import "fmt"
var Foo string
func main() {
if Foo == "" {
fmt.Println("Foo is empty.")
} else {
fmt.Printf("Foo=%sn", Foo)