2014-09-12 57 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