跳至主要内容

[pkg] runtime

Package runtime @ go.dev

runtime.NumGoroutine()

正確取得檔案的絕對路徑:runtime 搭配 filepath pkg

原始參考程式碼:grpc-go

想要在 server/server.go 中取得正確載入 route_guide_db.json 的檔案,且不論是在資料夾跟目錄執行 go run server/server.go 或在 server 資料夾內執行 go run server.go 都能正確載入:

資料夾結構

.
├── server
│ └── server.go
└── data
├── route_guide_db.json (想要在 server.go 中載入的檔案)
└── data.go

data.go

data.go 這隻檔案中:

  • 使用 runtime.Caller(0) 可以取得當前檔案的路徑
  • 使用 filepath.Dir() 可以取得當前檔案的資料夾
  • 使用 filepath.Join() 可以從此資料夾開始撰寫相對路徑
// https://github.com/grpc/grpc-go/blob/master/examples/data/data.go
// data/data.go
package data

import (
"path/filepath"
"runtime"
)

// basepath 是這個 package 的 root directory
var basepath string

func init() {
_, currentFile, _, _ := runtime.Caller(0)
basepath = filepath.Dir(currentFile)
}

// Path 會根據給的 relative file/directory path 回傳絕對路徑(absolute path)
// 如果原本就是絕對路徑,則不做事
func Path(rel string) string {
if filepath.IsAbs(rel) {
return rel
}

return filepath.Join(basepath, rel)
}

main.go

使用時,只需要在 main.go 中載入 data 這個 package,呼叫 data.Path("route_guide_db.json") 即可:

import "sandbox/grpc-go-sandbox/data"

func main() {
absPath := testdata.Path("route_guide_db.json")
}