用 Go 编写的程序有两种执行方式,go run 和 go build
两种的启动,获取到的路径也会不一样。
// 获取路径的方法
os.Getwd()
os.Executable()
runtime.Caller()
go run 建议使用 runtime.Caller()
go build 使用 os.Executable() runtime.Caller()
都可以
下面是获取结果
go run 启动获取的路径为:
/Users/mac/orange/project/helloWorld/pkg/utils
go build 启动获取的路径为:
/mnt/project/hellWorld
但这些方法还需要自己去选择调用,如果需要环境自适应
的话,可以使用以下代码:
重要提示:
for 循环的注释是指你这个方法可能放在 utils 包中,那获取到的路径则是 xxx/utils,如果需要获取到项目跟目录,去掉注释,把 helloWorld 改成你的项目名即可。
// 获取当前执行文件绝对路径(go run)
func GetCurrentAbPath() string {
dir := getCurrentAbPathByExecutable()
tmpDir, _ := filepath.EvalSymlinks(os.TempDir())
if strings.Contains(dir, tmpDir) {
currentDir := getCurrentAbPathByCaller()
// for {
// if filepath.Base(currentDir) != "helloWorld" {
// currentDir = filepath.Dir(currentDir)
// } else {
// break
// }
// }
return currentDir
}
return dir
}
// 获取当前执行文件绝对路径
func getCurrentAbPathByExecutable() string {
exePath, err := os.Executable()
if err != nil {
log.Fatal(err)
}
res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))
return res
}
// 获取当前执行文件绝对路径(go run)
func getCurrentAbPathByCaller() string {
var abPath string
_, filename, _, ok := runtime.Caller(0)
if ok {
abPath = path.Dir(filename)
}
return abPath
}
func TestGetCurrentAbPath(t *testing.T) {
fmt.Println("Project root: ", utils.GetCurrentAbPath())
}