转载请注明出处,原文连接http://tailnode.tk/2017/01/go...node
咱们常常会在一些程序的输出中看到程序版本、编译时间、Git的commit id等信息,好比dockerlinux
ming@vultr:~$ docker version Client: Version: 1.12.5 API version: 1.24 Go version: go1.6.4 Git commit: 7392c3b Built: Fri Dec 16 02:42:17 2016 OS/Arch: linux/amd64 ...
咱们能够提供一个配置文件version.conf
,程序运行时从version.conf
取得这些信息进行显示。可是在部署程序时,除了二进制文件还须要额外的配置文件,不是很方便。
或者将这些信息写入代码中,这样不须要额外的version.conf
,但要在每次编译时修改代码文件,也够麻烦的了。
有一种更好的办法是在编译时使用参数-ldflags -X importpath.name=value,官方解释以下golang
-X importpath.name=value
Set the value of the string variable in importpath named name to value.
Note that before Go 1.5 this option took two separate arguments.
Now it takes one argument split on the first = sign.docker
如下面代码说明ubuntu
package main import "fmt" var ( VERSION string BUILD_TIME string GO_VERSION string ) func main() { fmt.Printf("%s\n%s\n%s\n", VERSION, BUILD_TIME, GO_VERSION) }
用以下命令编译,注意由于date
和go version
的输出有空格,因此main.BUILD_TIME
和main.GO_VERSION
必须使用引号括起来ui
go build -ldflags "-X main.VERSION=1.0.0 -X 'main.BUILD_TIME=`date`' -X 'main.GO_VERSION=`go version`'"
编译成功后运行程序,结果以下this
ming@ubuntu:~/go_workspace/src/test$ ./test 1.0.0 Sun Feb 12 00:13:27 CST 2017 go version go1.7.5 linux/amd64