os.UserHomeDir în Go

Returnează directorul personal al utilizatorului și directoarele standard pentru configurare și cache.

Sintaxă
func UserHomeDir() (string, error)
func UserConfigDir() (string, error)   // Go 1.13
func UserCacheDir() (string, error)    // Go 1.11

Ce face os.UserHomeDir

os.UserHomeDir returnează directorul personal: $HOME pe Linux și macOS, %USERPROFILE% pe Windows.

os.UserConfigDir returnează locul în care aplicațiile își țin setările: $XDG_CONFIG_HOME sau ~/.config pe Linux, ~/Library/Application Support pe macOS, %AppData% pe Windows. os.UserCacheDir returnează locul pentru date care pot fi refăcute oricând: ~/.cache pe Linux, ~/Library/Caches pe macOS, %LocalAppData% pe Windows.

În aceste directoare creezi un subdirector cu numele aplicației tale, de exemplu filepath.Join(config, "facturi"). Toate trei dau eroare dacă locul nu poate fi aflat (de exemplu $HOME nu este setată).

Ce returnează

Calea directorului și nil, sau o eroare.

Exemple

Exemplul 1: Directoarele pe Linux

package main

import (
    "fmt"
    "os"
)

func main() {
    home, _ := os.UserHomeDir()
    config, _ := os.UserConfigDir()
    cache, _ := os.UserCacheDir()
    fmt.Println("home:  ", home)
    fmt.Println("config:", config)
    fmt.Println("cache: ", cache)
}

Rezultat pe Linux, pentru utilizatorul ana

home:   /home/ana
config: /home/ana/.config
cache:  /home/ana/.cache

Exemplul 2: Calea depinde de $HOME

Setăm HOME din cod. Rezultatul de mai jos este cel de pe macOS (unde a fost rulat exemplul); pe Linux ar fi /home/ana/.config și /home/ana/.cache.

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    os.Setenv("HOME", "/home/ana")
    os.Unsetenv("XDG_CONFIG_HOME")
    os.Unsetenv("XDG_CACHE_HOME")

    home, _ := os.UserHomeDir()
    config, _ := os.UserConfigDir()
    cache, _ := os.UserCacheDir()
    fmt.Println("home:  ", home)
    fmt.Println("config:", filepath.Join(config, "facturi", "setari.json"))
    fmt.Println("cache: ", filepath.Join(cache, "facturi"))
}

Rezultat

home:   /home/ana
config: /home/ana/Library/Application Support/facturi/setari.json
cache:  /home/ana/Library/Caches/facturi

Exemplul 3: Fără HOME: eroare

package main

import (
    "fmt"
    "os"
)

func main() {
    os.Unsetenv("HOME")
    _, err := os.UserHomeDir()
    fmt.Println("UserHomeDir:", err)
    _, err = os.UserConfigDir()
    fmt.Println("UserConfigDir:", err)
}

Rezultat

UserHomeDir: $HOME is not defined
UserConfigDir: $HOME is not defined

Greșeli frecvente

  • Scrii fișierele de configurare direct în directorul personal (~/.aplicatia_mea). Folosește UserConfigDir, unde utilizatorii le caută.
  • Construiești calea cu "~/...". Go nu înlocuiește ~; ia directorul cu UserHomeDir.
  • Pui în cache date care nu pot fi refăcute. Sistemul sau utilizatorul pot goli oricând directorul de cache.

Comenzi înrudite

  • os.Getenv: Returnează valoarea unei variabile de mediu sau textul gol dacă variabila nu există.
  • os.TempDir: Returnează directorul pentru fișiere temporare al sistemului (de obicei /tmp pe Linux).
  • filepath.Join: Unește mai multe bucăți într-o cale, cu separatorul corect al sistemului, și curăță rezultatul.
  • os.MkdirAll: Creează un director împreună cu toți părinții care lipsesc; nu dă eroare dacă directorul există deja.