如何通过go run命令检查Go程序是否没有运行?

fnvucqvd  于 2023-02-27  发布在  Go
关注(0)|答案(2)|浏览(229)

我想知道是否有一种非特定于操作系统的方法来测试Go语言程序是通过go run命令启动的,还是通过执行go build命令产生的二进制文件启动的。

aij0ehis

aij0ehis1#

第一:总是编译
第二:没有保证的方法来区分使用go buildgo run编译的二进制文件。
go run main.go只是构建一个临时二进制文件并执行它。
您可以通过打印os.Args[0](第一个参数)查看正在执行的二进制文件的路径。例如,对于以下程序:

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println(os.Args[0])
}
$ go run main.go
/tmp/go-build854217312/b001/exe/main

$  go build -o main . && ./main
./main

您可以尝试检测第一个文件在临时目录中的事实,但位置将取决于操作系统,并且不能保证在各个版本中保持相同。
总的来说,这可能是不值得的。go run是不可接受的任何严重的二进制,它应该总是被编译。

j2cgzkjk

j2cgzkjk2#

下面是我用来获取工作目录的函数,无论是使用go run运行还是构建它:

func GetWorkDir() string {
    ex, err := os.Executable()
    if err != nil {
        panic(err)
    }

    dir := filepath.Dir(ex)

    // Helpful when developing:
    // when running `go run`, the executable is in a temporary directory.
    if strings.Contains(dir, "go-build") {
        return "."
    }
    return filepath.Dir(ex)
}

相关问题