Apakah berikut cara terbaik untuk mendapatkan direktori home pengguna yang sedang berjalan? Atau adakah fungsi tertentu yang telah saya lihat?
os.Getenv("HOME")
Jika hal di atas benar, adakah yang kebetulan mengetahui apakah pendekatan ini dijamin bekerja pada platform non-Linux, misalnya Windows?
go
home-directory
Paul Ruane
sumber
sumber
$HOME
belum tentu direktori home pengguna. Misalnya, saya bisa menulisexport HOME=/something/else
sebelum meluncurkan program Anda. Biasanya itu berarti saya ingin program diperlakukan/something/else
sebagai direktori home saya karena alasan tertentu, dan biasanya program harus menerimanya. Tetapi jika Anda benar-benar membutuhkan direktori home sebenarnya dari pengguna , variabel lingkungan tidak akan selalu memberikannya kepada Anda.Jawaban:
Dalam go 1.0.3 (mungkin lebih awal, juga) bekerja berikut:
package main import ( "os/user" "fmt" "log" ) func main() { usr, err := user.Current() if err != nil { log.Fatal( err ) } fmt.Println( usr.HomeDir ) }
Jika penting untuk cross-kompilasi, pertimbangkan yang
homedir
perpustakaansumber
os.UserHomeDir ()
Di go1.12 + Anda dapat menggunakan os.UserHomeDir ()
Lihat https://golang.org/pkg/os/#UserHomeDir
Itu harus bekerja bahkan tanpa CGO diaktifkan (yaitu
FROM scratch
) dan tanpa harus mengurai/etc/passwd
atau omong kosong semacam itu.sumber
Sebagai contoh,
package main import ( "fmt" "os" "runtime" ) func UserHomeDir() string { if runtime.GOOS == "windows" { home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") if home == "" { home = os.Getenv("USERPROFILE") } return home } return os.Getenv("HOME") } func main() { dir := UserHomeDir() fmt.Println(dir) }
sumber
USERPROFILE
adalah root dari ruang penyimpanan Pengguna di sistem, tetapi BUKAN tempat di mana aplikasi harus menulis di luar prompt dialog simpan. Jika Anda memiliki konfigurasi aplikasi, konfigurasi tersebut harus ditulis keAPPDATA
dan jika Anda memiliki cache aplikasi (atau file besar yang tidak boleh disinkronkan melalui jaringan) , konfigurasi tersebut harus ditulisLOCALAPPDATA
di Windows.Berikut adalah cara yang bagus dan ringkas untuk melakukannya (jika Anda hanya menjalankan sistem berbasis UNIX):
import ( "os" ) var home string = os.Getenv("HOME")
Itu hanya menanyakan variabel lingkungan $ HOME.
--- Edit ---
Sekarang saya melihat bahwa metode yang sama disarankan di atas. Saya akan meninggalkan contoh ini di sini sebagai solusi suling.
sumber
Jawaban serupa untuk @peterSO tetapi menghormati
XDG_CONFIG_HOME
jalur untuk linux.package main import ( "fmt" "os" "runtime" ) func userHomeDir() string { if runtime.GOOS == "windows" { home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") if home == "" { home = os.Getenv("USERPROFILE") } return home } else if runtime.GOOS == "linux" { home := os.Getenv("XDG_CONFIG_HOME") if home != "" { return home } } return os.Getenv("HOME") } func main() { fmt.Println(userHomeDir()) }
sumber
APPDATA
untuk konfigurasi danLOCALAPPDATA
untuk file besar. Untuk tujuan umum "rumah", saya sarankanLOCALAPPDATA
agar secara default pengembang aplikasi tidak merusak jaringan perusahaan. 😊Anda harus menggunakan variabel lingkungan
USERPROFILE
atau diHOMEPATH
bawah Windows. Lihat Variabel Lingkungan yang Diakui (tautan dokumentasi yang lebih tepat akan disambut).sumber
HOME
, karena itu mungkin berarti Anda menjalankan cygwin.USERPROFILE
atauHOMEPATH
di Windows dalam sebagian besar kasus. Dalam hampir semua kasus di mana devs menggunakan itu, apa yang seharusnya mereka gunakan adalahAPPDATA
atauLOCALAPPDATA
(tergantung pada apakah konten tersebut masuk akal untuk disinkronkan melalui jaringan saat login / logout).go1.8rc2 memiliki fungsi go / build / defaultGOPATH yang mendapatkan direktori home. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277
Kode berikut diekstrak dari fungsi defaultGOPATH.
package main import ( "fmt" "os" "runtime" ) func UserHomeDir() string { env := "HOME" if runtime.GOOS == "windows" { env = "USERPROFILE" } else if runtime.GOOS == "plan9" { env = "home" } return os.Getenv(env) } func main() { dir := UserHomeDir() fmt.Println(dir) }
sumber
APPDATA
atauLOCALAPPDATA
hampir selalu merupakan pilihan yang tepat, bukanUSERPROFILE
, di Windows.