There is no cloud. It's just someone else's computer.

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# Formatta tutti i file Go nella directory corrente e sottodirectory
2gofmt -s -l -w .
3
4# Formatta un file specifico
5gofmt -s -w main.go
6
7# Mostra le differenze senza modificare i file
8gofmt -d main.go
 1// Prima
 2type Person struct{
 3  Name string
 4  Age int
 5}
 6
 7func (p Person)SayHello(){
 8  fmt.Println("Hello!")
 9}
10
11// Dopo gofmt
12type Person struct {
13  Name string
14  Age  int
15}
16
17func (p Person) SayHello() {
18  fmt.Println("Hello!")
19}

🔍 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# Esegui tutti i linter abilitati
2golangci-lint run
3
4# Esegui linter specifici
5golangci-lint run --disable-all --enable=errcheck,gosimple
6
7# Analizza solo i file modificati rispetto al main
8golangci-lint run --new-from-rev=HEAD
1# .golangci.yml esempio
2linters:
3  enable:
4    - govet     # analizza codice per errori comuni
5    - errcheck  # verifica la gestione degli errori
6    - staticcheck  # analizzatore statico avanzato
7    - gosimple  # semplifica il codice
8    - dupl      # trova codice duplicato
9    - 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# Analizza il pacchetto corrente
2go vet
3
4# Analizza tutti i pacchetti nel progetto
5go vet ./...
6
7# Analizza un file specifico
8go vet main.go
1func esempio() {
2  var x string
3  fmt.Printf("%d", x)  // go vet segnalerà questo errore di formato
4}

🔎 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# Installa revive
2go install github.com/mgechev/revive@latest
3
4# Esegui l'analisi base
5revive ./...
6
7# Usa una configurazione personalizzata
8revive -config config.toml ./...
 1# revive.toml esempio
 2ignoreGeneratedHeader = false
 3severity = "warning"
 4confidence = 0.8
 5
 6[rule.cyclomatic]
 7  arguments = [15]
 8[rule.function-length]
 9  arguments = [50]
10[rule.var-naming]
11  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# Analizza tutti i pacchetti nel progetto
2gosec ./...
3
4# Analizza un file specifico
5gosec main.go
1func insicuro() {
2  exec.Command("ls", os.Args[1]) // gosec avviserà del potenziale rischio di injection
3}

🎯 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# Scansiona la directory corrente per vulnerabilità
2trivy fs .
3
4# Scansiona un file specifico
5trivy fs main.go
1# Output esempio
2CRITICAL go:gin-gonic/gin:v1.7.0
3    → 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# Analizza un Dockerfile
2hadolint Dockerfile
3
4# Analizza un Dockerfile specifico
5hadolint -f json Dockerfile
1# Hadolint approva 👍
2FROM golang:1.21-alpine
3COPY . /app
4WORKDIR /app
5RUN go build -o main .
6CMD ["./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# Scansiona l'intero repository per segreti
2trufflehog --regex --entropy=True .
3
4# Scansiona un file specifico
5trufflehog --regex --entropy=True main.go
1# Esempio di output
2Found possible AWS key in commit a1b2c3d4:
3    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# Installa ls-lint
2npm install -g @ls-lint/ls-lint
3
4# Esegui ls-lint
5ls-lint
 1# .ls-lint.yml esempio
 2ls:
 3  .dir: kebab-case
 4  .go: kebab-case
 5  models:
 6    .go: PascalCase
 7  handlers:
 8    .go: snake_case
 9  
10ignore:
11  - node_modules
12  - .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