Golang 中如何获取当前路径,它们之间有啥差异

Golang 有多种方法可以获取到当前路径,但不同方法获取到的路径是有细微差异,在使用时需要注意一下。

将下面测试代码,保存为 main.go

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    getExePath()
    getAbsPath()
    getWorkingDirPath()
}

func getExePath() string {
    ex, err := os.Executable()
    if err != nil {
        panic(err)
    }
    exePath := filepath.Dir(ex)
    fmt.Println("exePath:", exePath)
    return exePath
}

func getAbsPath() string {
    dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    if err != nil {
        panic(err)
    }
    fmt.Println("absPath:", dir)
    return dir
}

func getWorkingDirPath() string {
    dir, err := os.Getwd()
    if err != nil {
        panic(err)
    }
    fmt.Println("workingDirPath:", dir)
    return dir
}

我们可以按以下用例场景运行:

# Go RUN 源码运行
$go run main.go
# 形如 /tmp/go-build****/b***/exe 之类为 `go run` 之后编译的临时目录
exePath: /tmp/go-build854301005/b001/exe
absPath: /tmp/go-build854301005/b001/exe
workingDirPath: /path-to-project/go-path-test/
# 编译后运行二进制文件
$go build -o main main.go
$./main
exePath: /path-to-project/go-path-test
absPath: /path-to-project/go-path-test
workingDirPath: /path-to-project/go-path-test
# 在其它目录下运行二进制文件
$cd ..
$./go-path-test/main
exePath: /path-to-project/go-path-test
absPath: /path-to-project/go-path-test
workingDirPath: /path-to-project

可以注意到 getExePath()getAbsPath() 基本相同,获取的是编译之后二进制文件所在目录,getWorkingDirPath() 获取到的是当前工作目录路径,即执行命令时所在目录。当然,目前cases 没有考虑 main 函数与各自路径函数在不同文件或不同目录的情况,感兴趣的同学,可自行测试验证一下。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!