Golang 中如何獲取當前路徑,它們之間有啥差異

ycrao發表於2020-12-29

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 協議》,轉載必須註明作者和本文連結

相關文章