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