簡體   English   中英

Can Go的鏈接器覆蓋初始化變量

[英]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)"'

go命令文檔說:

-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM