Golang技巧:轻松获取执行文件的当前路径
发表时间: 2024-05-29 09:14
Golang程序两种不同的执行方式
用Golang编写的应用程序有两种执行方式, go run和go build
通常的做法是go run用于本地开发, 用一个命令中快速测试代码确实非常方便;
在部署生产环境时,我们会通过go build构建出二进制文件然后上传到服务器再去执行。
golang 获取执行文件的当前路径:
package mainimport ( "fmt" "os" "path" "path/filepath" "runtime" "strings")// 方法一:func getExecutePath1() string { dir, _ := filepath.Abs(filepath.Dir(os.Args[0])) return strings.Replace(dir, "\", "/", -1)}// 方法二:func getExecutePath2() string { dir, _ := os.Executable() exPath := filepath.Dir(dir) return strings.Replace(exPath, "\", "/", -1)}// 方法三:func getExecutePath3() string { dir, _ := os.Getwd() return strings.Replace(dir, "\", "/", -1)}// 方法四: 推荐的方法, 能够灵活指定子目录func getExecutePath4() string { dir, _ := filepath.Abs("./") return strings.Replace(dir, "\", "/", -1)}// 方法五: 推荐的方法, Golang日志库 zap 关于路径都会有runtime.Caller()这个调用func getExecutePath5() string { var abPath string _, filename, _, ok := runtime.Caller(0) // 获取到当前的脚本文件(所写的代码的文件)的绝对路径 if ok { abPath = path.Dir(filename) } return abPath}func main() { // golang 获取当前可执行程序的当前路径(绝对路径) /* func Caller(skip int) (pc uintptr, file string, line int, ok bool) 参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,.... */ _, filename, _, ok := runtime.Caller(0) if !ok { panic("No caller information") } fmt.Println(filename, path.Dir(filename)) // F:/project/test/demo18.go F:/project/test //这里受到是否编译的影响 fmt.Println(getExecutePath1()) fmt.Println(getExecutePath2()) // 下面不受是否编译的影响 fmt.Println(getExecutePath3()) // 兼容性好 fmt.Println(getExecutePath4()) // 兼容性好, 但采用相对路径, 不推荐使用 fmt.Println(getExecutePath5()) // 推荐采用的方法, 兼容性最好}/*# 查看当前的目录[root@localhost data]# pwd/data# 直接运行程序[root@localhost data]# go run filepath.go/data/filepath.go /data/data/tmp/go-build414131938/b001/exe/tmp/go-build414131938/b001/exe/data/data/data# 对程序进行编译[root@localhost data]# go build -o filepath filepath.go[root@localhost data]# lsfilepath filepath.go# 对编译后的执行文件 运行[root@localhost data]# ./filepath/data/filepath.go /data/data/data/data/data/data/data# 对编译后的执行文件复制到/home, 运行执行文件[root@localhost data]# cp filepath /home/[root@localhost data]# cd /home/[root@localhost home]# ./filepath/data/filepath.go /data/home/home/home/home/home/home*/
注意: golang 使用路径时尽量使用绝对路径, 避免不必要的错误;