module și pachete în Go

Comanda go, module și teste Go 1.11 (module), implicite din Go 1.16

Un pachet este un director cu fișiere .go; un modul (go.mod) este un proiect cu mai multe pachete și dependențele lor.

Sintaxă
magazin/                 ← modulul exemplu.ro/magazin
├── go.mod
├── go.sum
├── main.go              ← package main
└── preturi/
    ├── preturi.go       ← package preturi
    └── preturi_test.go

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 package diferite î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.sum sau ștergerea lui din git: lasă-l pe seama lui go mod tidy.
  • Import circular (preturi importă main sau 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.