cli和双击go的二进制文件得到不同的路径

编辑于 2022-09-25 13:36:24 阅读 837

先看代码

func main() {
	root, err0 := os.Getwd()
	if err0 != nil {
		println("empty")
	}
	println("dir: " + root)
}

生成可执行文件

cuiwei@weideMacBook-Pro demo % go build -o app2 .   

cli的方式执行

cuiwei@weideMacBook-Pro demo % ./app2               
dir: /Users/cuiwei/GolandProjects/demo

双击 app2 的方式

Last login: Fri Sep  9 12:44:47 on ttys001
/Users/cuiwei/GolandProjects/demo/app2 ; exit;
cuiwei@weideMacBook-Pro ~ % /Users/cuiwei/GolandProjects/demo/app2 ; exit;
dir: /Users/cuiwei

总结

所以,依赖os.Getwd()做文件上传的,需要注意一下

更好的办法

func main() {
	ePath, err := os.Executable()
	if err != nil {
		panic(err)
	}

	// 全路径
	fmt.Println(ePath)
	// 所在目录
	fmt.Println("file directory", path.Dir(ePath))
}

os.Executable()获取的是可执行文件的绝对路径。需要注意的是:如果执行go run main.go得到的是一个临时的路径

cuiwei@weideMacBook-Pro demo % go run main.go 
/var/folders/0r/9vy7796d43v3tmp2fwwfqgpw0000gn/T/go-build1779961896/b001/exe/main
file directory /var/folders/0r/9vy7796d43v3tmp2fwwfqgpw0000gn/T/go-build1779961896/b001/exe

广而告之,我的新作品《语音助手》上架Google Play了,欢迎下载体验