从已编译的二进制文件中读取命令行标志

时间:2019-06-15 06:23:46

标签: go

我创建了一个简单的程序,在其中设置了2个标志并进行了构建。如何从已编译的二进制文件中读取这些标志并设置这2个值?

我尝试了多种方式读取文件,但没有找到标志值。

flag.go

var (
    name *string
    version *int
)

func init(){
    name = flag.String("name","test", "a string")
    version = flag.Int("version", 1.0, "an int")
}

func main(){
    flag.Parse()
    fmt.Println("name : ", *name)
    fmt.Println("version : ", *version)
}

main.go

func main(){
    path := "/Users/____/Desktop/flag"

    dat,_ := ioutil.ReadFile(path)

    strings.Contains(string(dat),"name")

    fmt.Println("%s opened\n", dat)
}

我想从编译的二进制中找到标志值,并将其存储到主程序变量中。像这样

var flagMain =测试 var versionMain = 1.0

1 个答案:

答案 0 :(得分:1)

flag.Parse()是运行时操作。

回读一个嵌入值意味着该值在编译时已嵌入。
参见AgentZombie go-embed-version作为示例:

go build -o /tmp/versserv -ldflags "-X github.com/AgentZombie/go-embed-version/cmd.Version=foo" server/server.go

然后您可以调用您的二进制文件,该二进制文件可以返回嵌入的值。
GoogleContainerTools/container-diff commit 367eb42中的PR 304中有相同的想法。
ahmetb/govvv

中的操作是自动化的(再次作为示例)