go run, go build și go install

Subiect din roadmap-ul Go · parte din „Introducere în Go”

În ecosistemul Go, comanda go run este instrumentul tău principal pentru dezvoltare rapidă și testare iterativă, permițându-ți să execuți codul sursă direct fără pași intermediari de compilare vizibilă. Pe de altă parte, go build generează un fișier binar executabil, esențial pentru testarea performanței reale sau pentru distribuirea aplicației în medii de staging. În final, go install compilează și plasează binarul în directorul definit de variabila de mediu GOPATH/bin, facilitând rularea proiectului din orice locație prin simpla invocare a numelui acestuia. Înțelegerea diferențelor dintre aceste trei fluxuri este crucială pentru a optimiza ciclul de dezvoltare și a preveni erori de mediu în producție.

Concepte cheie

  • Execuție instantanee (go run): Compilă temporar codul în memoria RAM și îl execută imediat, ideal pentru debugging rapid, dar nu produce un fișier permanent pe disc.
  • Generarea binarului (go build): Creează un executabil static (de obicei .exe pe Windows sau fără extensie pe Linux/macOS) care poate fi distribuit sau rulat independent de sursa Go.
  • Instalarea globală (go install): Similar cu build, dar mută rezultatul în directorul de sisteme ($GOPATH/bin sau ~/go/bin), făcând comanda disponibilă în shell-ul sistemului.
  • Modul de module: De la Go 1.11+, toate comenzile funcționează nativ cu modulele (go.mod), gestionând automat dependențele externe fără a necesita configurări complexe de cale.
  • Cache-ul de compilare: Go stochează pachetele compilate anterior; atât run cât și build folosesc acest cache pentru a accelera execuțiile ulterioare dacă codul nu s-a schimbat.
  • Variabile de mediu: Comportamentul install depinde critic de variabilele GOPATH și GOBIN, care determină unde va ajunge fișierul executabil final.
  • Flag-uri de optimizare: go build -o nume_fisier permite redenumirea binarului, iar flag-uri precum -ldflags pot injecta versiuni sau configurații în timpul compilării.

Exemplu practic

Imagină-ți că ai un proiect simplu cu un fișier main.go. Pentru a vedea rapid dacă logica funcționează, rulezi:

go run main.go

Acest lucru compilează și afișează outputul în terminal, dar nu lasă urme pe disc. Când ești gata să testezi aplicația ca un utilizator final, creezi binarul:

go build -o myapp
./myapp

Acum ai un fișier myapp (sau myapp.exe) pe care îl poți copia pe un server. Dacă vrei să folosești această unealtă ca pe o comandă standard (ex: myapp --help), folosești:

go install ./...
myapp

Această secvență simulează fluxul real de lucru: dezvoltare -> testare locală -> pregătire pentru deploy.

Greșeli frecvente

  • Confuzia între build și install: Mulți cred că go build face instalarea globală. De fapt, build lasă binarul în folderul curent, necesitând calea explicită (./nume_bin) pentru rulare.
  • Ignorarea go.mod: Rularea comenzilor în foldere fără un fișier go.mod valid poate duce la erori de dependențe sau la utilizarea accidentală a pachetelor vechi din cache.
  • Probleme de permisiuni la install: Dacă directorul GOPATH/bin nu este adăugat la variabila de sistem PATH, comanda go install va reuși, dar nu vei putea rula binarul din terminal prin numele său simplu.
  • Viteza iluzorie: Crederea că go run este mereu mai lent decât go build. În realitate, overhead-ul este minim pentru proiecte mici, iar diferența devine relevantă doar la compilări foarte mari.

Întrebări de interviu

1. Care este diferența principală între go build și go run? go build generează un fișier executabil pe disc pe care îl poți reutiliza, în timp ce go run compilează temporar și execută codul direct, fiind conceput pentru iterații rapide de dezvoltare.

2. Unde se plasează fișierul generat de go install? Binarii sunt plasați în directorul specificat de variabila de mediu GOPATH/bin (sau GOBIN dacă este setată), care trebuie să fie inclus în variabila de sistem PATH.

3. Poți folosi go run cu module externe? Da, go run descarcă automat modulele necesare din rețeaua Go Proxy (dacă nu sunt deja în cache) și le include în compilarea temporară.

Exercițiu

Creează un proiect Go nou numit calculator-cli. Scrie un program simplu care primește două numere ca argumente de linie de comandă și afișează suma lor.

  1. Inițializează modulul cu go mod init calculator-cli.
  2. Implementează logica în main.go.
  3. Rulează programul folosind go run main.go 5 3.
  4. Construiește un binar numit calc folosind go build -o calc.
  5. Instalează binarul global cu go install . și încearcă să rulezi calc 10 20 dintr-un folder diferit. Verifică dacă binarul instalat este accesibil din PATH-ul tău sistem.

Resurse gratuite

Alte subiecte din „Introducere în Go”