Golang Tools 🛠️

Golang Tools: Your code's best friends 🛠️

Ah, il meraviglioso mondo dei tool per Go! Se pensavi che scrivere codice fosse sufficiente, preparati a scoprire un universo di strumenti che renderanno il tuo codice più pulito di una cucina dopo una visita della suocera.

📝 Gofmt: Il parrucchiere del tuo codice

🔗 Documentazione Ufficiale

gofmt è il tool di formattazione ufficiale di Go. Non solo formatta il codice, ma lo rende conforme alle convenzioni di stile della comunità Go. L’opzione -s applica semplificazioni al codice, -l elenca i file modificati, e -w scrive le modifiche direttamente nei file.

Benefits:

  • Elimina le discussioni sullo stile del codice nel team
  • Garantisce consistenza in tutto il codebase
  • Aumenta la leggibilità del codice
  • Riduce il cognitive load durante il code review
1
2
3
4
5
6
7
8
# Formatta tutti i file Go nella directory corrente e sottodirectory
gofmt -s -l -w .

# Formatta un file specifico
gofmt -s -w main.go

# Mostra le differenze senza modificare i file
gofmt -d main.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// Prima
type Person struct{
  Name string
  Age int
}

func (p Person)SayHello(){
  fmt.Println("Hello!")
}

// Dopo gofmt
type Person struct {
  Name string
  Age  int
}

func (p Person) SayHello() {
  fmt.Println("Hello!")
}

🔍 Golangci-lint: Il detective perfezionista

🔗 Documentazione Ufficiale

golangci-lint è un meta-linter che combina decine di analizzatori statici in un unico strumento. Non solo trova errori, ma suggerisce anche miglioramenti per performance, sicurezza e manutenibilità del codice.

Benefits:

  • Trova bug prima che raggiungano la produzione
  • Migliora la qualità del codice attraverso best practices
  • Riduce il technical debt
  • Velocizza il processo di code review
1
2
3
4
5
6
7
8
# Esegui tutti i linter abilitati
golangci-lint run

# Esegui linter specifici
golangci-lint run --disable-all --enable=errcheck,gosimple

# Analizza solo i file modificati rispetto al main
golangci-lint run --new-from-rev=HEAD
1
2
3
4
5
6
7
8
9
# .golangci.yml esempio
linters:
  enable:
    - govet     # analizza codice per errori comuni
    - errcheck  # verifica la gestione degli errori
    - staticcheck  # analizzatore statico avanzato
    - gosimple  # semplifica il codice
    - dupl      # trova codice duplicato
    - goconst   # trova costanti che potrebbero essere dichiarate

🐛 Go vet: Il veterinario del codice

🔗 Documentazione Ufficiale

go vet è uno strumento di analisi statica che trova sottili errori che il compilatore potrebbe non rilevare. È particolarmente bravo a trovare errori nelle chiamate di funzione, nella costruzione di struct e nell’uso di Printf.

Benefits:

  • Individua errori subdoli prima dell’esecuzione
  • Migliora l’affidabilità del codice
  • Riduce i bug in produzione
  • Zero falsi positivi
1
2
3
4
5
6
7
8
# Analizza il pacchetto corrente
go vet

# Analizza tutti i pacchetti nel progetto
go vet ./...

# Analizza un file specifico
go vet main.go
1
2
3
4
func esempio() {
  var x string
  fmt.Printf("%d", x)  // go vet segnalerà questo errore di formato
}

🔎 Revive: L’ispettore del codice

🔗 Documentazione Ufficiale

revive è un linter veloce, configurabile e estensibile per Go. È come un ispettore che controlla che il tuo codice segua tutte le regole del “galateo della programmazione”.

Benefits:

  • Più veloce e flessibile di golint
  • Altamente configurabile con regole personalizzabili
  • Supporta l’esclusione di file e directory
  • Genera report in diversi formati (JSON, HTML, XML)
1
2
3
4
5
6
7
8
# Installa revive
go install github.com/mgechev/revive@latest

# Esegui l'analisi base
revive ./...

# Usa una configurazione personalizzata
revive -config config.toml ./...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# revive.toml esempio
ignoreGeneratedHeader = false
severity = "warning"
confidence = 0.8

[rule.cyclomatic]
  arguments = [15]
[rule.function-length]
  arguments = [50]
[rule.var-naming]
  arguments = [["ID", "URL"]]

🔒 Gosec: La guardia di sicurezza

🔗 Documentazione Ufficiale

gosec è il bodyguard del tuo codice. Cerca vulnerabilità di sicurezza come un metal detector all’aeroporto.

Benefits:

  • Identifica vulnerabilità di sicurezza critiche
  • Previene attacchi comuni
  • Applica best practices di sicurezza
  • Riduce il rischio di data breaches
1
2
3
4
5
# Analizza tutti i pacchetti nel progetto
gosec ./...

# Analizza un file specifico
gosec main.go
1
2
3
func insicuro() {
  exec.Command("ls", os.Args[1]) // gosec avviserà del potenziale rischio di injection
}

🎯 Trivy: Scanner delle dipendenze

🔗 Documentazione Ufficiale

trivy è come un metal detector per le vulnerabilità nelle dipendenze. Perché anche i pacchetti che usi potrebbero nascondere sorprese.

Benefits:

  • Scansiona vulnerabilità note nelle dipendenze
  • Mantiene l’ambiente di produzione sicuro
  • Fornisce report dettagliati
  • Supporta multiple tecnologie
1
2
3
4
5
# Scansiona la directory corrente per vulnerabilità
trivy fs .

# Scansiona un file specifico
trivy fs main.go
1
2
3
# Output esempio
CRITICAL go:gin-gonic/gin:v1.7.0
    → Gin before v1.7.1 allows remote attackers to exploit a vulnerability in...

🐳 Hadolint: Il critico d’arte dei dockerfile

🔗 Documentazione Ufficiale

hadolint è il critico d’arte che giudica i tuoi Dockerfile. Perché anche i container meritano eleganza.

Benefits:

  • Garantisce best practices nei Dockerfile
  • Ottimizza le immagini container
  • Riduce vulnerabilità di sicurezza
  • Migliora la manutenibilità
1
2
3
4
5
# Analizza un Dockerfile
hadolint Dockerfile

# Analizza un Dockerfile specifico
hadolint -f json Dockerfile
1
2
3
4
5
6
# Hadolint approva 👍
FROM golang:1.21-alpine
COPY . /app
WORKDIR /app
RUN go build -o main .
CMD ["./main"]

🕵️ Trufflehog: Il cacciatore di segreti

🔗 Documentazione Ufficiale

trufflehog è come un metal detector per segreti nel codice. Trova password, chiavi API e altri segreti che non dovrebbero essere nel repository.

Benefits:

  • Previene la fuga di dati sensibili
  • Automatizza la ricerca di credenziali esposte
  • Supporta ricerca in Git history
  • Riduce il rischio di compromissione delle credenziali
1
2
3
4
5
# Scansiona l'intero repository per segreti
trufflehog --regex --entropy=True .

# Scansiona un file specifico
trufflehog --regex --entropy=True main.go
1
2
3
# Esempio di output
Found possible AWS key in commit a1b2c3d4:
    AWS_SECRET_KEY=AKIAIOSFODNN7EXAMPLE

📁 Ls-lint: Il guardiano della struttura

🔗 Documentazione Ufficiale

ls-lint è un linter ultraveloce per la struttura dei file e delle directory. Garantisce che i nomi dei file e delle cartelle seguano le convenzioni del team.

Benefits:

  • Mantiene una struttura del progetto coerente
  • Previene confusione nella nomenclatura
  • Velocizza la navigazione del codice
  • Zero dipendenze e configurazione semplice
1
2
3
4
5
# Installa ls-lint
npm install -g @ls-lint/ls-lint

# Esegui ls-lint
ls-lint
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# .ls-lint.yml esempio
ls:
  .dir: kebab-case
  .go: kebab-case
  models:
    .go: PascalCase
  handlers:
    .go: snake_case
  
ignore:
  - node_modules
  - .git

💡 Conclusioni

Questi strumenti sono come una squadra di supereroi che proteggono il tuo codice da bug, vulnerabilità e formattazione discutibile. Usali regolarmente e il tuo codice ti ringrazierà (e anche i tuoi colleghi).

💪 Pro Tip: Integra questi tool nel tuo CI/CD pipeline. È come avere un team di revisori che non si lamenta mai delle ore di straordinario!

🔗 Riferimenti utili

Ultimo aggiornamento il