filepath.EvalSymlinks în Go

Returnează calea reală, după ce urmează toate legăturile simbolice din ea.

Sintaxă
func EvalSymlinks(path string) (string, error)

Ce face filepath.EvalSymlinks

filepath.EvalSymlinks parcurge calea element cu element și înlocuiește fiecare legătură simbolică cu ținta ei, apoi curăță rezultatul. Spre deosebire de Clean, accesează discul, deci fișierul trebuie să existe.

Dacă porniți de la o cale relativă, rezultatul e relativ la directorul curent. Pe macOS, de exemplu, /tmp este o legătură spre /private/tmp, iar EvalSymlinks("/tmp") returnează /private/tmp.

Parametri

Parametru Descriere
path Calea de rezolvat.

Ce returnează

Calea fără legături simbolice și nil, sau o eroare (de exemplu fișierul nu există).

Exemple

Exemplul 1: Urmarea unei legături

package main

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

func main() {
    os.MkdirAll("versiuni/v2.3", 0o755)
    os.WriteFile("versiuni/v2.3/app.conf", []byte("port=80"), 0o644)
    os.Symlink("versiuni/v2.3", "curent")

    real, err := filepath.EvalSymlinks("curent/app.conf")
    fmt.Println(real, err)

    _, err = filepath.EvalSymlinks("curent/lipsa.conf")
    fmt.Println(err)
}

Rezultat

versiuni/v2.3/app.conf <nil>
lstat versiuni/v2.3/lipsa.conf: no such file or directory

Exemplul 2: Executabilul real

Programul instalat ca legătură în /usr/local/bin.

package main

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

func main() {
    exe, _ := os.Executable()
    real, _ := filepath.EvalSymlinks(exe)
    fmt.Println("pornit ca:", exe)
    fmt.Println("fișierul real:", real)
}

Rezultat posibil (diferă la fiecare rulare)

pornit ca: /usr/local/bin/facturi
fișierul real: /opt/facturi/v1.4/facturi

Greșeli frecvente

  • Folosești EvalSymlinks pe o cale care încă nu există (un fișier pe care urmează să-l creezi). Primești eroare; rezolvă doar directorul părinte.

Comenzi înrudite

  • os.Symlink: Creează o legătură simbolică (scurtătură) spre alt fișier; Readlink citește spre ce arată.
  • filepath.Abs: Transformă o cale relativă în cale absolută, pornind de la directorul curent.
  • filepath.Clean: Simplifică o cale: elimină separatoarele duble, „.” și rezolvă „..” doar din text, fără acces la disc.
  • os.Executable: Returnează calea fișierului executabil care rulează acum (programul compilat).