Ниже приведен лучший способ получения домашнего каталога работающего пользователя? Или есть определенная функция, которую я разработал?
os.Getenv("HOME")
Если вышеизложенное правильно, кто-нибудь знает, гарантированно ли этот подход работает на платформах, не относящихся к Linux, например,. Windows?
В go 1.0.3 (вероятно, раньше тоже) выполняются следующие работы:
package main
import (
"os/user"
"fmt"
"log"
)
func main() {
usr, err := user.Current()
if err != nil {
log.Fatal( err )
}
fmt.Println( usr.HomeDir )
}
Если важно сопоставить, рассмотрите библиотеку homedir
В go1.12 + вы можете использовать os.UserHomeDir ()
home, err := os.UserHomeDir()
См. https://golang.org/pkg/os/#UserHomeDir
Это должно работать даже без включенной CGO (т.е. FROM scrut
) и без необходимости анализировать / etc / passwd
или другую подобную ерунду.
Например,
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)
}
Вот хороший, краткий способ сделать это (если вы работаете только в системе на основе UNIX):
import (
"os"
)
var home string = os.Getenv("HOME")
Это просто запрашивает переменную среды $ HOME.
--- Редактировать ---
Теперь я вижу, что этот же метод был предложен выше. Я оставлю этот пример здесь в виде дистиллированного раствора.
go1.8rc2 имеет функцию go / build / defaultGOPATH, которая получает домашний каталог. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277
Следующий код извлекается из функции GOPATH по умолчанию.
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)
}
Аналогичный ответ @peterSO, но уважает путь XDG_CONFIG_HOME
для 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())
}
Вы должны использовать переменную среды USERPROFILE
или HOMEPATH
под Windows. См. Признанные переменные среды (будет приветствоваться более подробная ссылка на документацию по apropos).