Ce face module și pachete
Pachetul este unitatea de cod din Go: toate fișierele .go dintr-un director, cu același package pe primul rând. Un pachet se importă după calea lui ("exemplu.ro/magazin/preturi") și se folosește prin numele lui (preturi.CuTVA); din el se văd doar numele care încep cu majusculă.
Modulul este proiectul: un director cu fișierul go.mod, care conține numele modulului (prefixul tuturor căilor de import), versiunea minimă de Go și dependențele (require). Fișierul go.sum păstrează sumele de control ale dependențelor, ca nimeni să nu le poată modifica pe ascuns. Ambele fișiere se pun în git.
Un modul nou se creează cu go mod init; dependențele se adaugă cu go get și se curăță cu go mod tidy. Numele modulului este de obicei adresa depozitului (github.com/ana/magazin), pentru ca alții să-l poată descărca. Pentru a lucra pe mai multe module locale deodată există go work.
Exemple
Exemplul 1: Un modul cu două pachete
main.go importă pachetul preturi din același modul, cu calea completă.
// go.mod
module exemplu.ro/magazin
go 1.27.2
// preturi/preturi.go
// Package preturi calculează prețuri cu TVA și reduceri.
package preturi
// TVA este cota standard de TVA din România.
const TVA = 0.21
// CuTVA returnează prețul cu TVA inclus.
func CuTVA(pret float64) float64 {
return pret * (1 + TVA)
}
// Reducere aplică un procent de reducere.
func Reducere(pret, procent float64) float64 {
return pret * (1 - procent/100)
}
// main.go
package main
import (
"fmt"
"exemplu.ro/magazin/preturi"
)
func main() {
pret := preturi.Reducere(preturi.CuTVA(100), 10)
fmt.Printf("Preț final: %.2f lei\n", pret)
}
// în terminal, în directorul magazin:
// go run .
Rezultat în terminal
Preț final: 108.90 lei
Exemplul 2: go.mod cu dependențe
require listează modulele folosite; // indirect marchează dependențele dependențelor.
cat go.mod
Conținutul fișierului
module github.com/ana/magazin
go 1.27.2
require (
github.com/google/uuid v1.6.0
golang.org/x/text v0.30.0
)
require golang.org/x/sync v0.17.0 // indirect
Greșeli frecvente
- Mai multe
packagediferite în același director: un director = un pachet. - Import relativ (
import "./preturi"): în module nu este permis; folosește calea completăexemplu.ro/magazin/preturi. - Modificarea manuală a lui
go.sumsau ștergerea lui din git: lasă-l pe seama luigo mod tidy. - Import circular (
preturiimportămainsau două pachete se importă reciproc):import cycle not allowed.
Comenzi înrudite
go mod init: Creează fișierul go.mod în directorul curent și transformă directorul într-un modul Go.go mod tidy: Aduce go.mod și go.sum în acord cu importurile din cod: adaugă dependențele lipsă și le șterge pe cele nefolosite.go get: Adaugă, actualizează sau elimină dependențe în go.mod; descarcă modulele necesare.package și pachetul main: Fiecare fișier Go începe cu package; pachetul main cu funcția main() devine un program executabil.import: Aduce în fișier pachete din biblioteca standard sau din alte module; numele pachetului devine prefixul folosit.vizibilitate (exportat/neexportat): Numele care încep cu literă mare sunt vizibile din alte pachete; cele cu literă mică rămân private pachetului.go work: Creează un workspace (go.work) ca să lucrezi deodată pe mai multe module locale, fără directive replace.