Dalam nodejs saya menggunakan __dirname . Apa yang setara dengan ini di Golang?
Saya telah mencari di Google dan menemukan artikel ini http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Di mana dia menggunakan kode di bawah ini
_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))
Tetapi apakah ini cara yang tepat atau idiomatis untuk dilakukan di Golang?
0
, bukan1
keruntime.Caller()
.runtime.Caller(0)
akan memberi Anda path file sumber, seperti$GOPATH/src/packagename/main.go
. Jawaban lain di utas ini mencoba mengembalikan jalur yang dapat dieksekusi (seperti$GOPATH/bin/packagename
).Jawaban:
Ini harus dilakukan:
sumber
_, currentFilePath, _, _ := runtime.Caller(0)
dirpath := path.Dir(currentFilePath)
(perhatikanruntime.Caller(0)
gantinyaruntime.Caller(1)
)EDIT: As of Go 1.8 (Dirilis Februari 2017) cara yang disarankan untuk melakukan ini adalah dengan
os.Executable
:Untuk mendapatkan direktori executable yang bisa Anda gunakan
path/filepath.Dir
.Contoh :
JAWABAN TUA:
Anda harus bisa menggunakannya
os.Getwd
Sebagai contoh:
sumber
runtime.Caller
adalah yang terdekat Anda akan mendapatkan "idiomatik"path/filepath.Dir
karenapath.Dir
hanya berfungsi dengan garis miring ke depan (gaya Unix) sebagai pemisah direktori.Gunakan paket osext
Ini menyediakan fungsi
ExecutableFolder()
yang mengembalikan jalur absolut ke folder tempat program yang saat ini dijalankan dapat dijalankan (berguna untuk pekerjaan cron). Ini lintas platform.Dokumentasi online
sumber
go run main.go
untuk pengembangan lokal. Tidak yakin bagaimana cara terbaik untuk menyiasatinya tanpa membangun executable terlebih dahulu setiap kali.go run
. Binari ini diletakkan di folder sementara setiap kali.go install
, kemudian berjalango build -v *.go && ./main
. Ini-v
akan memberi tahu Anda file mana yang sedang dibangun. Secara umum, saya telah menemukan bahwa waktu berbeda antarago run
dango build
dapat ditoleransi jika saya sudah menjalankango install
. Untuk pengguna windows di powershell, perintahnya adalahgo build -v {*}.go && ./main.exe
$GOPATH/bin/
, mengapa tidak digunakan$GOPATH/bin/
?Seperti yang dinyatakan dalam komentar, ini mengembalikan direktori yang saat ini aktif.
sumber
jika Anda menggunakan cara ini:
Anda akan mendapatkan path / tmp ketika Anda menjalankan program menggunakan beberapa IDE seperti GoLang karena executable akan menyimpan dan menjalankan dari / tmp
Saya pikir cara terbaik untuk mendapatkan Direktori Pekerjaan saat ini atau '.' adalah :
fungsi os.Getwd () akan mengembalikan direktori kerja saat ini. dan semuanya tanpa menggunakan perpustakaan eksternal apa pun: D
sumber
Jika Anda menggunakan paket osext oleh kardianos dan Anda perlu menguji secara lokal, seperti Derek Dowling berkomentar:
Solusi untuk ini adalah membuat utilitas gorun.exe alih-alih menggunakan go run. Utilitas gorun.exe akan mengkompilasi proyek menggunakan "pergi membangun", kemudian jalankan segera setelah itu, di direktori normal proyek Anda.
Saya punya masalah dengan kompiler lain dan menemukan diri saya membuat utilitas ini karena mereka tidak dikirim dengan kompiler ... itu terutama misterius dengan alat-alat seperti C di mana Anda harus mengkompilasi dan menghubungkan dan kemudian menjalankannya (terlalu banyak pekerjaan).
Jika ada yang menyukai ide saya tentang gorun.exe (atau peri), saya akan segera mengunggahnya ke github ..
Maaf, jawaban ini dimaksudkan sebagai komentar, tetapi saya tidak dapat berkomentar karena saya belum memiliki reputasi yang cukup besar.
Atau, "go run" dapat dimodifikasi (jika belum memiliki fitur ini) untuk memiliki parameter seperti "go run -notemp" untuk tidak menjalankan program dalam direktori sementara (atau yang serupa). Tapi saya lebih suka mengetik gorun atau "gor" karena lebih pendek dari parameter yang berbelit-belit. Gorun.exe atau gor.exe perlu diinstal di direktori yang sama dengan kompiler go Anda
Menerapkan gorun.exe (atau gor.exe) akan sepele, karena saya telah melakukannya dengan kompiler lain hanya dalam beberapa baris kode ... (kata-kata terakhir yang terkenal ;-)
sumber
_, callerFile, _, _ := runtime.Caller(0)
executablePath := filepath.Dir(callerFile)
sajaos.Executable
: https://tip.golang.org/pkg/os/#Executablefilepath.EvalSymlinks
: https://golang.org/pkg/path/filepath/#EvalSymlinksDemo Lengkap:
sumber
Terkadang ini cukup, argumen pertama akan selalu menjadi path file
sumber
Jawaban Gustavo Niemeyer luar biasa. Tetapi di Windows, runtime proc sebagian besar berada di dir lain, seperti ini:
Jika Anda menggunakan jalur file relatif, seperti
"/config/api.yaml"
, ini akan menggunakan jalur proyek Anda di mana kode Anda ada.sumber