使用go build时如何在链接标志的值字符串中包含空格

Pas*_*eBT 2 go

这是测试代码m.go:

package main

var version string

func main() {
    println("ver = ", version)
}
Run Code Online (Sandbox Code Playgroud)

如果我编译并链接到1.5:

go tool compile m.go
go tool link -o m -X main.version="abc 123" m.o
Run Code Online (Sandbox Code Playgroud)

工作良好.

但是如果我使用build命令和go 1.5:

go build -o m -ldflags '-X main.version="abc 123"' m.go
Run Code Online (Sandbox Code Playgroud)

它会显示帮助信息,这意味着错误

如果我改为1.4语法:

go build -o m -ldflags '-X main.version "abc 123"' m.go
Run Code Online (Sandbox Code Playgroud)

它的工作原理除了警告信息:

link: warning: option -X main.version abc 123 may not work in future releases; use -X main.version=abc 123
Run Code Online (Sandbox Code Playgroud)

如果参数值中没有空格,则工作正常:

go build -o m -ldflags '-X main.version=abc123' m.go
Run Code Online (Sandbox Code Playgroud)

因为编译和链接工作正常,所以我认为这不是链接部分问题.我比较了go1.4和1.5的构建源代码,对于ldflags部分,看起来没什么变化.因为我可以使用一些空间字符替换空间然后在程序中将其更改回来,但为什么呢?我错过了什么吗?使用-ldflags的正确语法是什么?谢谢

Jim*_*imB 10

文档:

请注意,在Go 1.5之前,此选项采用了两个单独的参数.
现在它需要在第一个=符号上拆分一个参数.

将整个参数括在引号中:

go build -o m -ldflags '-X "main.version=abc 123"' m.go
Run Code Online (Sandbox Code Playgroud)

  • 添加构建时变量的日期示例```go build -ldflags"-X'main.buildtime = $(date -u'+%Y-%m-%d%H:%M:%S')'" ``` (2认同)