2014-09-12 41 views
4

ld's docs可以去的连接器覆盖初始化的变量

-X符号值

设置否则未初始化字符串变量的值。符号名称的格式应为importpath.name,如由“go tool nm”打印的符号表中所示。

所以这很酷。它可以让你做的东西是这样的:

package main 

import "fmt" 

var version string 

func main() { 
    fmt.Println(version) 
} 

编译:go build -ldflags '-X main.version 42' ...

我对他的地图项的两个问题。首先,它也适用于初始化字符串(例如var version = "bad build"),即使文档明确指出“否则未初始化字符串变量”。

秒问题是关于空间。我Makefile包含以下行:

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)"' 

documentation for the go command说:

-ldflags 'flag list'

所以他们使用单引号所有连接标志。但是,包含空格作为-X标志的符号的字符串呢?双引号工作得很好,所以做单引号转义btw。,我只是不确定我可以依靠所有这一切工作始终如一,因为文档没有提及任何它。

第一个问题的澄清:

转到零初始化所有瓦尔。

该文档说:-X symbol value Set the value of an otherwise uninitialized string variable [...]

这是否意味着:

var foo string // only this one? 
var bar = "bar" // or this one too, maybe 

回答

2

引号被shell处理(或制造),所以是很一致的。

调用程序将填充go的参数。

//编辑

要使用默认的版本,你可以使用这样的事情:

var version string 

func init() { 
    if len(version) == 0 { 
     version = "master" 
    } 
} 

//编辑2

spec

当记忆分配用于存储值,通过 声明或make或n的调用ew,并且没有明确的初始化 被提供,内存被赋予一个默认的初始化。将此值的每个 元素设置为其值为零的值:对于布尔值,假设为 ,对于指针,函数,接口,切片,通道,布尔值为0,对于整数为0,对于整数为0.0,对于字符串为“”和零 和地图。

+0

完美。谢谢。初始化变量呢? – superlukas 2014-09-12 18:16:20

+1

那么......默认情况下,Go中的所有变量都初始化为零值。所以我不知道如何找到一个未初始化的变量来设置。 – 2014-09-12 19:16:19

+0

@superlukas你究竟是什么意思?如果我没有设置,你想使用特定的有效吗? – OneOfOne 2014-09-12 19:17:17