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 使用路径时尽量使用绝对路径, 避免不必要的错误;