[英]Can Go's linker override initialized variables
來自ld的文檔 :
-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)"'
-ldflags 'flag list'
所以他們對所有鏈接器標志都使用單引號。 但是包含空格作為-X
標志的符號的字符串呢? 雙引號工作得很好,所以轉義單引號順便說一下。我只是不確定我可以依靠所有這些來一致地工作,因為文檔沒有提到任何一個。
澄清第一個問題:
去零 - 初始化所有變量。
文檔說: -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
引號由shell(或make)處理,所以是的,它是一致的。
調用程序填充了go
的參數。
//編輯
要使用默認版本,您可以使用以下內容:
var version string
func init() {
if len(version) == 0 {
version = "master"
}
}
//編輯2
從規格 :
當分配內存來存儲值時,無論是通過聲明還是調用make或new,並且沒有提供顯式初始化,內存都會被賦予默認初始化。 這種值的每個元素都設置為其類型的零值:布爾值為false,整數為0,浮點數為0.0, 字符串為“” ,指針,函數,接口,切片,通道和映射為nil。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.