¿Es la siguiente la mejor manera de obtener el directorio de inicio del usuario en ejecución? ¿O hay una función específica que he desarrollado?
os.Getenv("HOME")
Si lo anterior es correcto, ¿alguien sabe si se garantiza que este enfoque funcione en plataformas que no sean Linux, por ejemplo, Windows?
go
home-directory
Paul Ruane
fuente
fuente

$HOMEno es necesariamente el directorio de inicio del usuario. Por ejemplo, puedo escribirexport HOME=/something/elseantes de lanzar su programa. Por lo general, eso significa que quiero que el programa lo trate/something/elsecomo mi directorio de inicio por alguna razón, y generalmente el programa debería aceptarlo. Pero si realmente necesita el directorio de inicio real del usuario , una variable de entorno no necesariamente se lo proporcionará.Respuestas:
En go 1.0.3 (probablemente antes también) funciona lo siguiente:
package main import ( "os/user" "fmt" "log" ) func main() { usr, err := user.Current() if err != nil { log.Fatal( err ) } fmt.Println( usr.HomeDir ) }Si es importante realizar una compilación cruzada, considere la
homedirbibliotecafuente
os.UserHomeDir ()
En go1.12 + puede usar os.UserHomeDir ()
Ver https://golang.org/pkg/os/#UserHomeDir
Eso debería funcionar incluso sin CGO habilitado (es decir
FROM scratch) y sin tener que analizar/etc/passwdu otras tonterías similares.fuente
Por ejemplo,
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) }fuente
USERPROFILEes la raíz del espacio de almacenamiento del usuario en el sistema, pero NO es el lugar donde las aplicaciones deben escribir fuera de un cuadro de diálogo para guardar. Si tiene una configuración de la aplicación, debe escribirse en ellaAPPDATAy si tiene un caché de la aplicación (o archivos grandes que no deben sincronizarse a través de una red) debe escribirseLOCALAPPDATAen Windows.Aquí hay una forma agradable y concisa de hacerlo (si solo está ejecutando en un sistema basado en UNIX):
import ( "os" ) var home string = os.Getenv("HOME")Eso solo consulta la variable de entorno $ HOME.
--- Editar ---
Ahora veo que este mismo método se sugirió anteriormente. Dejaré este ejemplo aquí como una solución destilada.
fuente
Respuesta similar a @peterSO pero respeta la
XDG_CONFIG_HOMEruta para 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()) }fuente
APPDATApara configuración yLOCALAPPDATApara archivos grandes. Para un "hogar" de propósito general, recomiendoLOCALAPPDATAque, por defecto, los desarrolladores de aplicaciones no destruyan las redes corporativas. 😊Debe utilizar la variable de entorno
USERPROFILEoHOMEPATHen Windows. Consulte Variables de entorno reconocidas (se agradecería un enlace de documentación más apropiado).fuente
HOME, ya que eso probablemente significa que está ejecutando cygwin.USERPROFILEoHOMEPATHen Windows en la gran mayoría de los casos. En casi todos los casos en los que los desarrolladores los usan, lo que deberían usar esAPPDATAoLOCALAPPDATA(dependiendo de si es razonable que el contenido se sincronice a través de la red al iniciar / cerrar sesión).go1.8rc2 tiene la función go / build / defaultGOPATH que obtiene el directorio de inicio. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277
El siguiente código se extrae de la función 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) }fuente
APPDATAoLOCALAPPDATAcasi siempre es la opción correcta, noUSERPROFILE, en Windows.