os.Environ în Go

Returnează toate variabilele de mediu, ca o listă de texte de forma NUME=valoare.

Sintaxă
func Environ() []string

Ce face os.Environ

os.Environ returnează o copie a întregului mediu al procesului. Fiecare element are forma "NUME=valoare"; le separi cu strings.Cut(e, "="). Ordinea nu este garantată.

Este folosită des pentru a porni un proces copil cu mediul curent plus câteva variabile în plus: cmd.Env = append(os.Environ(), "MOD=test").

Ce returnează

Un []string nou; modificarea lui nu schimbă mediul procesului.

Exemple

Exemplul 1: Listarea variabilelor

Golim mediul cu os.Clearenv ca rezultatul să fie același pe orice calculator, apoi sortăm.

package main

import (
    "fmt"
    "os"
    "slices"
)

func main() {
    os.Clearenv()
    os.Setenv("ORAS", "Iași")
    os.Setenv("LIMBA", "ro")
    os.Setenv("MONEDA", "RON")

    mediu := os.Environ()
    slices.Sort(mediu)
    for _, e := range mediu {
        fmt.Println(e)
    }
}

Rezultat

LIMBA=ro
MONEDA=RON
ORAS=Iași

Exemplul 2: Separarea numelui de valoare

package main

import (
    "fmt"
    "os"
    "slices"
    "strings"
)

func main() {
    os.Setenv("APP_PORT", "8080")
    os.Setenv("APP_MOD", "test")
    os.Setenv("APP_URL", "https://exemplu.ro/?a=1")

    setari := map[string]string{}
    for _, e := range os.Environ() {
        nume, valoare, _ := strings.Cut(e, "=") // taie doar la primul =
        if strings.HasPrefix(nume, "APP_") {
            setari[nume] = valoare
        }
    }
    chei := make([]string, 0, len(setari))
    for k := range setari {
        chei = append(chei, k)
    }
    slices.Sort(chei)
    for _, k := range chei {
        fmt.Printf("%-8s -> %s\n", k, setari[k])
    }
}

Rezultat

APP_MOD  -> test
APP_PORT -> 8080
APP_URL  -> https://exemplu.ro/?a=1

Exemplul 3: Mediu extins pentru un proces copil

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    cmd := exec.Command("sh", "-c", "echo rulăm în modul $MOD")
    cmd.Env = append(os.Environ(), "MOD=test")
    iesire, err := cmd.Output()
    fmt.Print(string(iesire))
    fmt.Println("eroare:", err)
    fmt.Printf("în părinte MOD = %q\n", os.Getenv("MOD"))
}

Rezultat

rulăm în modul test
eroare: <nil>
în părinte MOD = ""

Greșeli frecvente

  • Afișezi tot mediul în jurnale. Poate conține parole și chei API; filtrează ce afișezi.
  • Împarți cu strings.Split(e, "="): valorile pot conține =. Folosește strings.Cut, care taie doar la primul.

Comenzi înrudite

  • os.Getenv: Returnează valoarea unei variabile de mediu sau textul gol dacă variabila nu există.
  • os.Clearenv: Șterge toate variabilele de mediu ale procesului curent.
  • os.Setenv: Setează o variabilă de mediu pentru programul curent; Unsetenv o șterge.
  • exec.Cmd: Structura care descrie o comandă externă: programul, argumentele, directorul, mediul și intrarea/ieșirile ei.