Primul program: package main și func main

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

În Go, structura de bază a oricărui executabil este definită prin package main și funcția main(). Acest mecanism nu este doar o formalitate sintactică, ci pilonul modularității limbajului, asigurând că aplicațiile tale sunt izolate, reutilizabile și ușor de testat. În practică, înțelegerea corectă a acestui concept te ajută să structurezi proiectele complexe în module logice, facilitând colaborarea în echipe și menținerea codului curat. Fără o stăpânire solidă a acestei baze, depanarea erorilor de compilare sau integrarea bibliotecilor externe devine o provocare inutil de mare.

Concepte cheie

  • Package main: Este un pachet special care indică compilatorului că fișierul sursă trebuie transformat într-un executabil, nu într-o bibliotecă încorporabilă.
  • Funcția main(): Este punctul de intrare obligatoriu al aplicației; execuția programului începe aici și se termină când această funcție se finalizează.
  • Declarația import: Permite accesul la funcționalități standard sau terțe, esențiale pentru operațiuni I/O, manipulare date sau comunicare rețea.
  • Namespace-ul implicit: Fiecare fișier .go aparține unui singur pachet, declarate la începutul fișierului, ceea ce previne coliziunile de nume între module diferite.
  • Exportarea simbolurilor: În Go, numele care încep cu literă mare sunt exportate (publice) către alte pachete, iar cele cu literă mică rămân private în interiorul pachetului.
  • Compilarea statică: Go compilează tot codul într-un singur binar, incluzând dependențele, ceea ce face distribuirea aplicațiilor foarte simplă pe diverse sisteme.

Exemplu practic

Un scenariu comun este scrierea unei aplicații CLI simple care afișează un mesaj de salut. Codul arată astfel:

package main

import (
	"fmt"
	"os"
)

func main() {
	name := "Developer"
	if len(os.Args) > 1 {
		name = os.Args[1]
	}
	fmt.Printf("Salut, %s! Bine ai venit în Go.\n", name)
}

Aici, package main declară executabilul. Importăm fmt pentru formatarea ieșirii și os pentru a accesa argumentele liniei de comandă. Funcția main verifică dacă utilizatorul a trecut un nume ca argument; dacă nu, folosește un nume implicit. Acest pattern este frecvent întâlnit în tool-uri interne dezvoltate în companii.

Greșeli frecvente

  • Lipsa funcției main: Dacă un pachet este marcat ca main dar nu conține funcția main(), compilatorul va refuza generarea executabilului cu eroarea function main is undefined.
  • Importuri neutilizate: Go este strict în privința importurilor; dacă importi un pachet dar nu îl folosești în cod, compilarea eșuează. Trebuie să ștergi importul sau să îl folosești.
  • Confuzia dintre package și folder: Deși convenția este ca un director să corespundă unui pachet, poți avea mai multe fișiere în același director care aparțin aceluiași pachet, nu neapărat unul per fișier.
  • Ignorarea valorilor returnate: Deși nu este strict legat de main, uitarea de a gestiona erorile returnate de funcțiile standard (ex: fmt.Println) poate duce la comportamente imprevizibile în producție.

Întrebări de interviu

De ce Go necesită o funcție main() explicită? Pentru a oferi un punct de intrare clar și predictibil, similar cu C/C++, facilitând compilarea statică și rularea directă a binarilor fără runtime complex.

Ce se întâmplă dacă definesc mai multe funcții main în același pachet? Compilatorul va genera o eroare de duplicat, deoarece fiecare pachet main poate avea exact o singură funcție main ca punct de intrare.

Poate un pachet main să importe alte pachete? Da, absolut. Un pachet main poate importa orice alt pachet disponibil, exact ca orice alt modul din ecosistemul Go.

Exercițiu

Creează un program simplu care citește un număr întreg de la tastatură și afișează dacă acesta este par sau impar. Folosește fmt.Scanln pentru input și operatorul modulo %. Testează programul cu cel puțin trei valori diferite (par pozitiv, impar negativ, zero). Timp estimat: 30-45 minute.

Resurse gratuite

Alte subiecte din „Introducere în Go”