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


ld’s docs开始:

-X symbol value

Set the value of an otherwise uninitialized string variable. The symbol name should be of the form importpath.name, as displayed in the symbol table printed by “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标志的符号的字符串呢?双引号工作得很好,所以转义单引号顺便说一下.我只是不确定我可以依靠所有这些来一致地工作,因为文档没有提到任何一个.

澄清第一个问题:

去零 – 初始化所有变量.

文档说:-X symbol value设置否则未初始化的字符串变量[…]的值.

这是否意味着:

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

最佳答案 引号由shell(或make)处理,所以是的,它是一致的.

调用程序填充了go的args.

//编辑

要使用默认版本,您可以使用以下内容:

var version string

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

//编辑2

spec

When memory is allocated to store a value, either through a
declaration or a call of make or new, and no explicit initialization
is provided, the memory is given a default initialization. Each
element of such a value is set to the zero value for its type: false
for booleans, 0 for integers, 0.0 for floats, “” for strings, and nil
for pointers, functions, interfaces, slices, channels, and maps.

点赞