你遇到过 go run main.go 或go build main.go 获取到的路径不一样的问题嘛? 这是由于go run会将源代码编译到系统TEMP或TMP环境变量目录中并启动执行;而go build只会在当前目录编译出可执行文件,并不会自动执行。 使用 runtime.caller(0)来解决 说明: 这样写的话,无论执行go run xx.go 或者 go build xx.go 返回的路径 都是一样的1. 本节结构
2. Go程序的两种执行方式
3. 两种方式下带来的问题
func getCurrentAbPathByExecutable() string {
exePath, err := os.Executable()
if err != nil {
fmt.Print(err)
}
res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))
return res
}
func main() {
curPath := getCurrentAbPathByExecutable()
fmt.Println(curPath)
}
// go run main.go 输出
// tmp/go-build4104269073/b001/exe
func getCurrentAbPathByExecutable() string {
exePath, err := os.Executable()
if err != nil {
fmt.Print(err)
}
res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))
return res
}
func main() {
curPath := getCurrentAbPathByExecutable()
fmt.Println(curPath)
}
// go build main.go 输出
// /opt/go_code/demo/path
4. 产生不同路径的原因
5. 解决办法
func getCurrentAbPathByExecutable() string {
var absPath string
_, file, _, ok := runtime.Caller(0)
if ok {
absPath = path.Dir(file)
}
return absPath
}
func main() {
curPath := getCurrentAbPathByExecutable()
fmt.Println(curPath)
}