技术&日志

golang获取程序当前路径

golang运行的方式共有3种、每种运行方式也会导致获取的路径有差

  • go build main.go 编译成二进制程序
  • go run main.go 直接运行源码
  • go test main.go 调试模式下运行

获取当前路径的方式

方式1

os.Args[0]

方式2

pwd, err := os.Getwd()
println("Getwd: ", pwd, err)

方式3

exePath, err := os.Executable()
if err != nil {
    log.Fatal(err)
}
res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))
println(res)

方式4

var abPath string
_, filename, _, ok := runtime.Caller(0)
if ok {
    abPath = path.Dir(filename)
}
println(abPath)

4种方式在不同模式下运行输出的结果

go run

方式1 os.arg:  /var/folders/cn/tdmhdvk55xbgzfj9xhjlbff40000gn/T/go-build2612382668/b001/exe/main
方式2 Getwd:  /Users/jw/workspace/base/golang-example/eg-os (0x0,0x0)
方式3 getCurrentAbPathByExecutable:  /private/var/folders/cn/tdmhdvk55xbgzfj9xhjlbff40000gn/T/go-build2612382668/b001/exe
方式4 getCurrentAbPathByCaller:  /Users/jw/workspace/base/golang-example/util

go build

方式1 os.arg:  ./main
方式2 Getwd:  /Users/jw/workspace/base/golang-example/eg-os (0x0,0x0)
方式3 getCurrentAbPathByExecutable:  /Users/jw/workspace/base/golang-example/eg-os
方式4 getCurrentAbPathByCaller:  /Users/jw/workspace/base/golang-example/util

go test 运行输出结果

方式1 os.arg:  /var/folders/cn/tdmhdvk55xbgzfj9xhjlbff40000gn/T/go-build1715781360/b001/eg-os.test
方式2 Getwd:  /Users/jw/workspace/base/golang-example/eg-os (0x0,0x0)
方式3 getCurrentAbPathByExecutable:  /private/var/folders/cn/tdmhdvk55xbgzfj9xhjlbff40000gn/T/go-build1715781360/b001
方式4 getCurrentAbPathByCaller:  /Users/jw/workspace/base/golang-example/util

参考资料

代码位置参考

Golang获取当前项目绝对路径

聊一聊,Golang “相对”路径问题

发表评论