来自ld's docs:
-X符号值
设置否则未初始化的字符串变量的值。符号名称应为importpath.name形式,如" go tool nm"打印的符号表中所示。
所以这很酷。它允许你做这样的事情:
package main
import "fmt"
var version string
func main() {
fmt.Println(version)
}
编译:{{1}}
我有两个关于他的功能的问题。首先,它也适用于初始化的字符串(例如go build -ldflags '-X main.version 42' ...
),即使文档明确说明"否则未初始化的字符串变量"。
秒问题是关于空格的。我的var version = "bad build"
包含以下行:
Makefile
documentation for the go
command说:
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null) GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null) LDFLAGS := '-X main.version "$(GIT_BRANCH) $(GIT_COMMIT)"'
因此他们为所有链接器标志使用单引号。但是包含空格作为-ldflags 'flag list'
标志的符号的字符串呢?双引号工作得很好,所以转义单引号顺便说一句,我不确定我可以依靠所有这些来一致地工作,因为文档没有提及任何一个。
澄清第一个问题:
去零 - 初始化所有变量。
文档说:-X
。
这是否意味着:
-X symbol value Set the value of an otherwise uninitialized string variable [...]
答案 0 :(得分:2)
引号由shell(或make)处理,所以是的,它是一致的。
调用程序会填充go
的参数。
//修改
要使用默认版本,您可以使用以下内容:
var version string
func init() {
if len(version) == 0 {
version = "master"
}
}
//编辑2
来自spec:
当分配内存来存储值时,通过a 声明或调用make或new,并且没有明确的初始化 如果提供,则为存储器提供默认初始化。每 将此类值的元素设置为其类型的零值:false 对于布尔值,0表示整数,0.0表示浮点数,""对于字符串,和nil 用于指针,函数,接口,切片,通道和地图。