go语言如何在编译阶段给变量赋值

Go 语言编译时,可以通过 -ldflags 的方式,为指定包中的变量赋值。

格式
$ go build -ldflags "-X '$包名.变量名=$变量值'"

示例

文件结构

1
2
3
4
5
6
.
|-- go.mod
|-- go.sum
|-- main.go
`-- version
`-- version.go

go.mod

1
2
3
4
5
6
7
8
9
module app/testing

go 1.13

require (
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
github.com/sirupsen/logrus v1.4.2
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 // indirect
)

main.go

1
2
3
4
5
6
7
8
9
package main

import (
"app/testing/version"
)

func main() {
version.ShowVersion()
}

version/version.go

1
2
3
4
5
6
7
8
9
10
11
12
package version

import "fmt"

//Version app version
//注意:不能写在函数里面
var Version string

//ShowVersion output current version
func ShowVersion() {
fmt.Println("version: " + Version)
}

编译与运行

1
2
3
4
$ go build -ldflags "-X 'app/testing/version.Version=1.0.0'"
// 或 go build -ldflags "-X 'version.Version=1.0.0'" # module 部分可忽略
$ ./testing.exe
version: 1.0.0