Aller au contenu

Écosystème et outils

L'écosystème Go est minimaliste mais complet. Le compilateur, le formateur, le testeur et le linter de base sont tous inclus dans la distribution officielle. Des outils tiers comme golangci-lint, staticcheck et Delve completent le tableau pour la qualité du code et le débogage.


IDEs et éditeurs

VS Code avec gopls

VS Code est l'éditeur le plus utilisé pour Go grâce à l'extension officielle qui intégré gopls, le language server officiel du projet Go.

# Installation de l'extension Go pour VS Code
code --install-extension golang.Go

# gopls est installe automatiquement par l'extension
# ou manuellement :
go install golang.org/x/tools/gopls@latest

Configuration recommandee (.vscode/settings.json) :

{
    "go.useLanguageServer": true,
    "go.lintTool": "golangci-lint",
    "go.lintFlags": ["--fast"],
    "go.formatTool": "goimports",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
        "source.organizeImports": "explicit"
    },
    "[go]": {
        "editor.defaultFormatter": "golang.go",
        "editor.tabSize": 4,
        "editor.insertSpaces": false
    }
}

Fonctionnalités de gopls :

Fonctionnalité Description
Completion Auto-completion contextuelle avec types
Hover Documentation inline au survol
Go to définition Navigation vers la définition (F12)
Find références Toutes les utilisations d'un symbole
Rename Renommage sur tout le projet
Code lens Run / Debug / Benchmark directement dans le fichier
Inlay hints Affichage des types déduits

GoLand

GoLand (JetBrains) est l'IDE commercial de référence. Il intégré natvement le debogueur Delve, le profiler, la navigation de code avancee et les refactorings.

Raccourcis GoLand essentiels :
  Ctrl+Space      — Completion
  Ctrl+B          — Go to definition
  Ctrl+Shift+F10  — Run le fichier courant
  Shift+F9        — Debug le fichier courant
  Ctrl+Alt+L      — Reformater (gofmt)
  Ctrl+T          — Run les tests
  Alt+Enter       — Quick fix / intentions

Formatage et imports

gofmt

# Formater tous les fichiers Go recursivement
gofmt -w .

# Afficher les differences sans modifier
gofmt -d .

# Verifier qu'aucun fichier n'a besoin de formatage (CI)
test -z "$(gofmt -l .)"

goimports

goimports etend gofmt en ajoutant la gestion automatique des imports.

go install golang.org/x/tools/cmd/goimports@latest

# Formater et corriger les imports
goimports -w .

# Utiliser avec un proxy d'imports pour les gros monorepos
goimports -local example.com/myorg -w .

Linters — golangci-lint

golangci-lint est le meta-linter Go de référence. Il exécuté plusieurs linters en parallèle et est le standard pour les projets open source et en entreprise.

# Installation
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

# Lancement
golangci-lint run ./...

# Avec timeout et corrections automatiques
golangci-lint run --timeout=5m --fix ./...

Configuration recommandee

# .golangci.yml
run:
  timeout: 5m

linters:
  enable:
    - errcheck      # Verifie que les erreurs ne sont pas ignorees
    - gosimple      # Suggestions de simplification du code
    - govet         # Analyse statique officielle (go vet)
    - ineffassign   # Assignations inefficaces (valeur jamais utilisee)
    - staticcheck   # Suite de checks avances
    - unused        # Symboles declares mais jamais utilises
    - gofmt         # Verification du formatage
    - goimports     # Verification des imports
    - gocritic      # Suite de checks stylistiques et idiomatiques
    - gosec         # Detection de vulnerabilites de securite
    - misspell      # Fautes d'orthographe dans les commentaires
    - nilerr        # return nil, nil quand une erreur est attendue
    - bodyclose     # Verifier que resp.Body est ferme

linters-settings:
  errcheck:
    check-type-assertions: true
    check-blank: true
  govet:
    enable-all: true
  staticcheck:
    checks: ["all"]

issues:
  exclude-rules:
    # Ignorer errcheck dans les fichiers de test
    - path: _test\.go
      linters:
        - errcheck

Analyse statique

staticcheck

staticcheck est le linter statique le plus avance pour Go. Il détecté des bugs subtils, des patterns obsolètes et des inefficacites.

go install honnef.co/go/tools/cmd/staticcheck@latest

# Analyse complete
staticcheck ./...

# Checks specifiques
staticcheck -checks "SA*" ./...  # Tous les checks staticcheck
staticcheck -checks "S1*" ./...  # Simplifications de code

Catégories de checks :

Prefix Description
SA Bugs, code mort, mauvaises utilisations d'API
S Simplifications de code possibles
ST Conventions de style
QF Quick fixes disponibles

govulncheck

go install golang.org/x/vuln/cmd/govulncheck@latest

# Scanner les vulnerabilites connues dans les dependances
govulncheck ./...

# Sortie typique
# Vulnerability #1: GO-2024-2611
# A malicious HTTP server can cause a client to panic in net/http
# Found in: net/http@go1.21.0
# Fixed in: net/http@go1.21.8

go vet

go vet est intégré dans la chaîne d'outils Go et détecté les erreurs courantes.

# Analyse statique de base
go vet ./...

# Activites detaillees
go vet -composites=false -httpresponse=false ./...

Débogage — Delve

Delve est le debogueur officiel Go. Il supporte les goroutines, les breakpoints conditionnels et l'inspection de l'état complet du programme.

go install github.com/go-delve/delve/cmd/dlv@latest

# Demarrer un programme en mode debug
dlv debug .

# Attacher a un processus en cours
dlv attach <pid>

# Debug d'un test specifique
dlv test -- -run TestNomDuTest

Commandes Delve essentielles :

(dlv) break main.main          -- Breakpoint sur une fonction
(dlv) break handler.go:42      -- Breakpoint sur une ligne
(dlv) condition 1 i > 10       -- Breakpoint conditionnel
(dlv) continue                 -- Continuer l'execution (c)
(dlv) next                     -- Ligne suivante sans entrer dans les fonctions (n)
(dlv) step                     -- Entrer dans la fonction (s)
(dlv) stepout                  -- Sortir de la fonction courante
(dlv) print nomVariable        -- Afficher la valeur d'une variable (p)
(dlv) locals                   -- Toutes les variables locales
(dlv) goroutines               -- Lister toutes les goroutines actives
(dlv) goroutine 3              -- Basculer vers la goroutine 3
(dlv) stack                    -- Afficher la pile d'appels

Le debogueur VS Code utilise Delve en arriere-plan. La configuration de lancement :

// .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug programme",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}",
            "args": ["--port", "8080"]
        },
        {
            "name": "Debug test courant",
            "type": "go",
            "request": "launch",
            "mode": "test",
            "program": "${fileDirname}"
        }
    ]
}

Profiling — pprof et fgprof

pprof intégré

# Profil CPU — 30 secondes d'echantillonnage
go tool pprof -http=:8088 http://localhost:6060/debug/pprof/profile?seconds=30

# Profil memoire (allocations courantes)
go tool pprof -http=:8088 http://localhost:6060/debug/pprof/heap

# Trace d'execution (goroutines, GC, syscalls)
curl -o trace.out http://localhost:6060/debug/pprof/trace?seconds=5
go tool trace trace.out

# Profil depuis les benchmarks
go test -bench=BenchmarkMaFonction -cpuprofile=cpu.out -memprofile=mem.out
go tool pprof -http=:8088 cpu.out

fgprof — profiler wall-clock

# fgprof mesure le temps mur (inclut les blocages I/O, contrairement a pprof CPU)
go install github.com/felixge/fgprof/cmd/fgprof@latest

Gestion des versions Go

Contrairement a Python (pyenv) ou Node (nvm), Go n'a pas de gestionnaire de versions dédié — go.mod spécifié la version minimale requise et le compilateur installe géré la compatibilité.

# Verifier la version installee
go version

# Installer une version specifique de Go (toolchain Go 1.21+)
go install golang.org/dl/go1.22.3@latest
go1.22.3 download
go1.22.3 version

# Avec mise (alternative moderne a asdf)
mise use go@1.22.3
mise use go@latest

Directive toolchain dans go.mod

Depuis Go 1.21, go.mod peut inclure une directive toolchain go1.22.3 pour specifier la version exacte du compilateur a utiliser, en plus de la version minimale du langage. Le compilateur Go 1.21+ telechargera automatiquement la bonne toolchain si nécessaire.