Can Go的链接器覆盖初始化变量

时间:2014-09-12 16:31:02

标签: go

来自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 [...]

1 个答案:

答案 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   用于指针,函数,接口,切片,通道和地图。