golang如何判断是从源码运行还是从二进制文件运行?

新手上路,请多包涵

开发和测试的时候需要加载配置文件,但是由于golang的配置文件用的是相对路径,main.go是在cmd下面的,这和二进制文件获得base dir是不同的,如何判断是go run main.go运行还是./main运行

阅读 6.7k
3 个回答

linux下,二进制启动的ppid会等于sid。也查找父进程的启动参数可以看出。

关于gobuild和gorun启动的dir不同,可以在配置设置一个workdir,在启动的时候自动os.Chdir()切换到workdir去。

无论是 go run main.go 还是 go build 之后的可执行文件,其实都是一样的。go run 会生成一个临时可执行文件用于运行,执行完成后会将这个临时文件删除。

简言之,两者的意义是一样的。也就不存在 go run 还是 go build 的二进制运行的判断方式。它们都是二进制方式运行。

配置文件一般都是放在一个固定的目录,或者是当前二进制文件所在目录。当然,最灵活的方式是通过命令行参数执行。

你可参考一篇文章,地址:https://eddycjy.com/posts/go/...。如想具体了解 go run main.go 的临时目录,参考我写的一篇文章:https://segmentfault.com/a/11...

以下方法可以简单地判断,程序是否是从go run(命令行或ide)里执行的,从而决定从工作目录还是go-bindata打包的Resource里读取配置、语言文件。

func IsRelease() bool {
    arg1 := strings.ToLower(os.Args[0])
    name := filepath.Base(arg1)
    return strings.Index(name, constant.AppName) == 0 && strings.Index(arg1, "go-build") < 0
}
推荐问题
宣传栏