golang- ldflags

例如替换main包中的变量如下:

package main

var version="N/A"

func main() {
    fmt.Println(version)
}
go build -a -ldflags "-X main.version=1.2" -o bin/demo main.go

运行测试如下:

~ ./bin/demo
1.2

但是测试到覆盖子包下的变量时,发现一直替换不成功。

~ mkdir pkg
~ touch pkg/vars.go
~ cat pkg.vars.go
package pkg

import "fmt"

var version="N/A"

func Init()  {
    fmt.Printf("pkg.version: %s\n",version)
}

在main函数中调用Init

func main() {
    fmt.Println(version)
    pkg.Init()
}

编译测试:

go build -a -ldflags "-X main.version=1.2 -X pkg/pkg.version=1.3" -o bin/demo main.go
./bin/demo
1.2
pkg.version: N/A
demo/pkg/pkg.versiongithub.com/csi/demo

究竟这个路径到底是什么,根据网上的资料检索,发现有一个工具可以直接列出编译的二进制文件中的变量路径:

go tool nm ./bin/demo | grep version
 162f6e0 D demo/pkg.version
 162f870 D main.version
 1404b10 R main.version.str

通过这个工具,可以直观得到子包中的变量全路径到底是什么。如果是多级子目录的话,测试如下:

cd github.com/kubernetes-csi/csi-driver-nfs
go tool nm ./bin/amd64/nfsplugin| grep driverVersion
 18a3600 D csi-driver-nfs/pkg/nfs.driverVersion
 155b4c8 R csi-driver-nfs/pkg/nfs.driverVersion.str
go tool nm