Это лучший способ получить домашний каталог работающего пользователя? Или есть какая-то конкретная функция, которую я переиграл?
os.Getenv("HOME")
Если вышесказанное верно, может ли кто-нибудь знать, будет ли этот подход гарантированно работать на платформах, отличных от Linux, например, Windows?
go
home-directory
Пол Руан
источник
источник
$HOME
не обязательно является домашним каталогом пользователя. Например, я могу написатьexport HOME=/something/else
перед запуском вашей программы. Обычно это означает, что я хочу, чтобы программа по/something/else
какой-то причине считалась моим домашним каталогом, и обычно программа должна это принять. Но если вам действительно нужен реальный домашний каталог пользователя, переменная среды не обязательно даст вам его.Ответы:
В 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
библиотекуисточник
os.UserHomeDir ()
В go1.12 + вы можете использовать os.UserHomeDir ()
См. Https://golang.org/pkg/os/#UserHomeDir
Это должно работать даже без включенного CGO (т.е.
FROM scratch
) и без необходимости синтаксического анализа/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) }
источник
USERPROFILE
- это корень дискового пространства пользователя в системе, но это НЕ то место, куда приложения должны выполнять запись вне диалогового окна сохранения. Если у вас есть конфигурация приложения, она должна быть записана,APPDATA
а если у вас есть кеш приложения (или большие файлы, которые не должны синхронизироваться по сети), он должен быть записан вLOCALAPPDATA
Windows.Вот хороший и лаконичный способ сделать это (если вы работаете только в системе на основе UNIX):
import ( "os" ) var home string = os.Getenv("HOME")
Это просто запрашивает переменную среды $ HOME.
--- Редактировать ---
Теперь я вижу, что тот же метод был предложен выше. Я оставлю этот пример здесь как дистиллированный раствор.
источник
Аналогичный ответ на @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()) }
источник
APPDATA
для настройки иLOCALAPPDATA
для больших файлов. Для «дома» общего назначения я рекомендую,LOCALAPPDATA
чтобы разработчики приложений по умолчанию не разрушали корпоративные сети. 😊Вы должны использовать переменную окружения
USERPROFILE
илиHOMEPATH
под Windows. См. Распознанные переменные среды (приветствуется более подходящая ссылка на документацию).источник
HOME
, поскольку это, вероятно, означает, что вы работаете под cygwin.USERPROFILE
илиHOMEPATH
в Windows в подавляющем большинстве случаев. Почти во всех случаях, когда разработчики используют их, они должны использоватьAPPDATA
илиLOCALAPPDATA
(в зависимости от того, разумно ли синхронизировать содержимое по сети при входе в систему / выходе из системы).go1.8rc2 имеет функцию go / build / defaultGOPATH, которая получает домашний каталог. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277
Следующий код извлечен из функции 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) }
источник
APPDATA
илиLOCALAPPDATA
почти всегда правильный выбор, неUSERPROFILE
в Windows.