Chapitre 23
23 - Annexes
> Glossaire, cheat sheets, et références rapides pour le développement Go.
Cours 23 : Annexes Go
300+ lignes de glossaire, cheat sheets, idioms, et erreurs fréquentes.
Partie 1 : Glossaire (200+ termes)
A
| Terme | Définition |
|---|---|
| any | Alias pour interface{} (Go 1.18+) |
| Argument | Valeur passée à un appel de fonction |
| Array | Séquence de taille fixe d'éléments du même type |
| Assignment | Opération qui donne une valeur à une variable |
| Atomic | Opération non-interruptible, thread-safe |
| Automatic semicolon | Règle d'insertion automatique du point-virgule |
B
| Terme | Définition |
|---|---|
| Benchmark | Test de performance mesuré avec testing.B |
| Blank identifier | _ (underscore), ignore la valeur retournée |
| Block | Séquence de déclarations et statements entre {} |
| Break | Statement qui sort d'une boucle ou d'un switch |
| Buffered channel | Channel avec capacité de stockage (file d'attente) |
| Build constraint | Condition pour inclure/exclure un fichier lors du build |
| Build tag | Synonyme de build constraint |
| Byte | Alias pour uint8 |
| BSS | Segment mémoire pour les variables globales non initialisées |
C
| Terme | Définition |
|---|---|
| Call | Invocation d'une fonction |
| Cap | Capacité d'une slice ou d'un channel |
| Cgo | Mécanisme pour appeler du code C depuis Go |
| Channel | Primitive de communication entre goroutines |
| Closure | Fonction qui capture des variables de sa portée englobante |
| Comparable | Contrainte générique autorisant == et != |
| Composite literal | Syntaxe pour créer des valeurs de types composites |
| Const | Déclaration de constante |
| Context | Package pour la propagation de délais, annulations et valeurs |
| Continue | Statement qui passe à l'itération suivante d'une boucle |
| Copy | Fonction intégrée pour copier des éléments entre slices |
| CSP | Communicating Sequential Processes (Hoare) |
| Coverage | Mesure de la proportion de code testé |
D
| Terme | Définition |
|---|---|
| Data race | Accès concurrent non synchronisé à une variable partagée |
| Deadlock | Situation où des goroutines s'attendent mutuellement |
| Defer | Reporte l'exécution d'un appel de fonction au retour |
| Dependency | Module ou package requis par le code |
| Directory | Dossier contenant des fichiers source Go |
| Duck typing | Un type satisfait une interface s'il a les méthodes requises |
| Dynamic type | Le type concret stocké dans une interface |
E
| Terme | Définition |
|---|---|
| Ellipsis | ... pour paramètres variadiques ou expansion de slice |
| Embed | Directive //go:embed pour inclure des fichiers dans le binaire |
| Embedding | Inclusion d'un type dans une structure (composition) |
| Empty interface | interface{} ou any, accepte tout type |
| Error | Interface prédéfinie avec Error() string |
| Escape analysis | Détermine si une variable est allouée sur le heap |
| Export | Identifiant commençant par une majuscule |
| Expression | Combinaison d'opérandes et d'opérateurs |
F
| Terme | Définition |
|---|---|
| Fallthrough | Statement qui passe au cas suivant dans switch |
| Fan-in | Pattern de concurrence qui fusionne plusieurs channels |
| Fan-out | Pattern de concurrence qui distribue le travail |
| Flag | Package standard pour analyser les arguments CLI |
| Float | Types flottants : float32, float64 |
| For | Unique mot-clé de boucle en Go |
| Func | Mot-clé pour déclarer une fonction |
| Fuzzing | Test automatisé avec des entrées aléatoires |
G
| Terme | Définition |
|---|---|
| Garbage Collector | Ramasse-miettes concurrent (tri-color mark-and-sweep) |
| Generics | Paramètres de type (Go 1.18+) |
| Gofmt | Outil de formatage automatique du code |
| GOMAXPROCS | Nombre maximum de threads OS pour les goroutines |
| GOPATH | Ancien système de workspace (remplacé par modules) |
| GOROOT | Chemin d'installation du compilateur Go |
| Goroutine | Fil d'exécution léger, ~2KB de stack initiale |
| Go tool | Suite d'outils intégrés (build, test, vet, pprof) |
| GOPROXY | Proxy de modules Go |
| GOSUMDB | Base de sommes de checksums des modules |
H
| Terme | Définition |
|---|---|
| Handle | Fonction qui traite une requête HTTP |
| Handler | Interface http.Handler avec ServeHTTP |
| Heap | Mémoire allouée dynamiquement (gérée par le GC) |
| HTTP/2 | Protocole HTTP/2 supporté nativement |
I
| Terme | Définition |
|---|---|
| Identifieur | Nom d'une entité (variable, fonction, type) |
| If | Statement conditionnel |
| Import | Déclaration pour utiliser un package externe |
| Inlining | Optimisation du compilateur qui substitue l'appel |
| Int | Type entier (taille dépend de la plateforme) |
| Interface | Ensemble de méthodes définissant un contrat |
| Interface embedding | Composition d'interfaces |
| Interface value | Paire (type concret, valeur concrète) |
| Iterate | Parcourir les éléments d'une collection |
| ioutil | Package déprécié (remplacé par io/os depuis Go 1.16) |
J
| Terme | Définition |
|---|---|
| JSON | Format d'échange de données supporté par encoding/json |
K
| Terme | Définition |
|---|---|
| Key | Clé dans une map ou un struct |
| Keyword | Mot réservé du langage (25 mots-clés) |
L
| Terme | Définition |
|---|---|
| Len | Fonction intégrée pour la longueur d'une collection |
| Linter | Outil d'analyse statique du code |
| Literal | Représentation littérale d'une valeur |
| Liveness | Pointeur vers une valeur encore active (GC) |
| Log | Package pour l'enregistrement de logs |
| Loop | Boucle de répétition (seulement for) |
M
| Terme | Définition |
|---|---|
| M:N scheduling | Modèle M goroutines sur N threads OS |
| Make | Fonction intégrée pour créer slices, maps, channels |
| Map | Collection associative (clé -> valeur) |
| Marshal | Conversion d'une structure en JSON/Protobuf |
| Method | Fonction avec un récepteur |
| Method set | Ensemble des méthodes d'un type |
| Middleware | Fonction qui enveloppe un handler HTTP |
| Module | Collection de packages Go versionnés |
| Mutex | Verrou d'exclusion mutuelle (sync.Mutex) |
N
| Terme | Définition |
|---|---|
| Named result | Paramètre de retour nommé dans une fonction |
| New | Fonction intégrée pour allouer (retourne un pointeur) |
| Nil | Valeur zéro pour les pointeurs, slices, maps, channels, interfaces, fonctions |
| Nop | No-operation (io.Discard, http.HandlerFunc) |
O
| Terme | Définition |
|---|---|
| Once | sync.Once : exécute une fonction une seule fois |
| Overflow | Dépassement de capacité d'un type entier |
| Omitempty | Tag JSON pour omettre les champs vides |
P
| Terme | Définition |
|---|---|
| Package | Collection de fichiers source dans un même dossier |
| Panic | Erreur runtime qui déroule la pile d'appels |
| Parameter | Variable dans la déclaration d'une fonction |
| Pipeline | Chaîne d'étapes connectées par des channels |
| Pointer | Variable contenant l'adresse mémoire d'une autre variable |
| Pool | sync.Pool pour réutiliser des objets temporaires |
| pprof | Outil de profilage CPU et mémoire |
| Preemption | Interruption d'une goroutine par le scheduler |
| Protobuf | Protocol Buffers (sérialisation binaire) |
| Proxy | Serveur intermédiaire pour les modules Go |
Q
| Terme | Définition |
|---|---|
| Query | Requête SQL |
| Queue | File d'attente (implémentable avec channel) |
R
| Terme | Définition |
|---|---|
| Race detector | Outil intégré pour détecter les data races |
| Range | Mot-clé pour itérer sur une collection |
| Receiver | Paramètre spécial d'une méthode (valeur ou pointeur) |
| Recover | Fonction pour reprendre après une panic |
| Reflection | Introsection des types à l'exécution |
| Rune | Alias pour int32, représente un point de code Unicode |
| RWMutex | Mutex avec lecture/écriture (sync.RWMutex) |
S
| Terme | Définition |
|---|---|
| Scheduler | Ordonnanceur des goroutines (M:N) |
| Scope | Portée de visibilité d'un identifieur |
| Select | Statement pour attendre sur plusieurs channels |
| Shadowing | Masquage d'une variable par une autre de même nom |
| Short declaration | := déclare et initialise une variable |
| Slice | Vue dynamique sur un tableau (ptr, len, cap) |
| Stack | Pile mémoire (chaque goroutine a sa stack) |
| String | Chaîne de caractères UTF-8 immuable |
| Struct | Type composé de champs nommés |
| Switch | Statement de sélection multi-cas |
| Sync | Package de synchronisation (Mutex, WaitGroup, Once, Cond) |
T
| Terme | Définition |
|---|---|
| Table-driven test | Test paramétré avec un tableau de cas |
| Ticker | Timer périodique (time.Ticker) |
| Timer | Timer unique (time.Timer) |
| Trace | Outil de traçage d'exécution |
| Type | Déclaration de type ou mot-clé |
| Type assertion | x.(T) pour extraire le type concret d'une interface |
| Type switch | Switch sur le type dynamique d'une interface |
U
| Terme | Définition |
|---|---|
| Unbuffered channel | Channel sans capacité (synchronisation) |
| Unicode | Standard d'encodage de caractères |
| Unmarshal | Désérialisation JSON/Protobuf |
| Unsafe | Package pour les opérations non typées |
| UDP | Protocole de transport non fiable |
| UUID | Identifiant unique universel |
V
| Terme | Définition |
|---|---|
| Value | Donnée concrète stockée dans une variable |
| Value receiver | Méthode qui reçoit une copie de la valeur |
| Var | Mot-clé pour déclarer une variable |
| Variable | Zone mémoire nommée contenant une valeur |
| Vet | Outil d'analyse statique (go vet) |
| Viper | Bibliothèque de gestion de configuration |
W
| Terme | Définition |
|---|---|
| WaitGroup | sync.WaitGroup pour attendre des goroutines |
| Worker pool | Pattern avec N goroutines partageant un channel de jobs |
| Write barrier | Mécanisme du GC pour maintenir la cohérence du marquage |
X-Z
| Terme | Définition |
|---|---|
| YAML | Format de sérialisation lisible |
| Zero value | Valeur par défaut d'un type (0, "", nil, false) |
| Zombie goroutine | Goroutine qui fuit (jamais terminée) |
| 1.18 | Version ayant introduit les generics |
| 1.21 | Version avec min, max, clear, slog stabilisé |
| 1.22 | Version avec amélioration du for loop, range over int |
| 1.23 | Version avec range over func, iterators |
Partie 2 : Cheat Sheets
2.1 Commandes Go essentielles
# Développement
go mod init <module> # Initialiser un module
go mod tidy # Nettoyer les dépendances
go mod vendor # Créer le dossier vendor
go build ./... # Compiler tout le projet
go run . # Exécuter le package courant
go install # Compiler et installer
# Tests
go test ./... # Exécuter tous les tests
go test -v ./... # Mode verbose
go test -run TestXxx # Filtrer par nom
go test -bench . # Exécuter les benchmarks
go test -cover # Couverture de code
go test -race ./... # Race detector
go test -fuzz . # Fuzzing
# Qualité
go fmt ./... # Formater tout le code
go vet ./... # Analyse statique
go mod verify # Vérifier les dépendances
# Profilage
go test -cpuprofile cpu.out
go test -memprofile mem.out
go test -trace trace.out
go tool pprof cpu.out
go tool trace trace.out
# Cross-compilation
GOOS=linux GOARCH=amd64 go build
GOOS=windows GOARCH=amd64 go build
GOOS=darwin GOARCH=arm64 go build
2.2 Slice Operations
// Création
s := make([]int, 0, 10) // len=0, cap=10
s := []int{1, 2, 3} // literal
var s []int // nil slice
// Ajout
s = append(s, 4) // ajoute un élément
s = append(s, 5, 6) // ajoute plusieurs
s = append(s, others...) // concatène une slice
// Suppression
s = append(s[:i], s[i+1:]...) // supprime l'élément i
s = s[:len(s)-1] // supprime le dernier
s = s[:0] // vide la slice (sans réallouer)
// Copie
n := copy(dst, src) // copie min(len(dst), len(src)) éléments
// Tri
sort.Slice(s, func(i, j int) bool { return s[i] < s[j] })
sort.Ints(s)
sort.Strings(s)
// Recherche
idx := sort.Search(len(s), func(i int) bool { return s[i] >= x })
2.3 Map Operations
// Création
m := make(map[string]int)
m := map[string]int{"a": 1}
var m map[string]int // nil map
// CRUD
m["key"] = 42 // Set
v := m["key"] // Get (0 si absent)
v, ok := m["key"] // Get avec vérification
delete(m, "key") // Delete
clear(m) // Vide la map (Go 1.21+)
// Iteration
for k, v := range m { /* ordre aléatoire */ }
for k := range m { /* keys only */ }
// Longueur
n := len(m)
2.4 Channel Operations
// Création
ch := make(chan int) // unbuffered
ch := make(chan int, 10) // buffered
ch := make(<-chan int) // receive-only
ch := make(chan<- int) // send-only
// Send/Receive
ch <- 42 // send (bloque si full/unbuffered without receiver)
v := <-ch // receive (bloque si vide)
v, ok := <-ch // receive avec check fermeture
// Close
close(ch) // seul le sender ferme
for v := range ch { /*...*/ } // range jusqu'à fermeture
// Select
select {
case v := <-ch1:
// ...
case ch2 <- v:
// ...
case <-time.After(timeout):
// timeout
default:
// aucun cas prêt
}
2.5 JSON Operations
// Marshal
data, err := json.Marshal(v)
data, err := json.MarshalIndent(v, "", " ")
// Unmarshal
err := json.Unmarshal(data, &v)
// Stream
decoder := json.NewDecoder(r)
err := decoder.Decode(&v)
encoder := json.NewEncoder(w)
err := encoder.Encode(v)
// Tags
type User struct {
ID int `json:"id"`
Name string `json:"name,omitempty"`
Email string `json:"-"`
}
2.6 HTTP Server
// Handler basique
http.HandleFunc("/api", handler)
http.ListenAndServe(":8080", nil)
// Avec timeout
srv := &http.Server{
Addr: ":8080",
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 60 * time.Second,
}
srv.ListenAndServe()
// Graceful shutdown
srv.Shutdown(ctx)
// Client HTTP
client := &http.Client{
Timeout: 30 * time.Second,
Transport: &http.Transport{
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
},
}
resp, err := client.Get(url)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
2.7 Error Handling
// Création
errors.New("message") // simple
fmt.Errorf("context: %w", err) // wrapping (Go 1.13+)
// Vérification
if err != nil { /* handle */ }
// Unwrap
errors.Is(err, ErrNotFound) // vérifie la chaîne d'erreurs
errors.As(err, &target) // cast dans la chaîne
// Sentinel errors
var ErrNotFound = errors.New("not found")
// Custom error type
type ValidationError struct {
Field string
Err error
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validation error on %s: %v", e.Field, e.Err)
}
func (e *ValidationError) Unwrap() error { return e.Err }
2.8 go.mod File Example
module github.com/user/project
go 1.23
require (
github.com/go-chi/chi/v5 v5.1.0
github.com/jackc/pgx/v5 v5.7.1
github.com/redis/go-redis/v9 v9.6.1
go.uber.org/zap v1.27.0
)
require (
github.com/cespare/xxhash/v2 v2.3.0 // indirect
)
Partie 3 : 30 Idiomes Go Essentiels
3.1 Idiomes de base
1. Zero value initialization
var s []string // nil slice, pas besoin de make
var m map[string]int // nil map, mais ne pas écrire dedans
2. Short variable declarations
s := "hello" // vs var s string = "hello"
3. Multiple returns
func div(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
4. Blank identifier
for _, v := range slice { /* only value */ }
5. Named result parameters
func minMax(a, b int) (min, max int) { ... }
3.2 Idiomes de structure
6. Functional options pattern
type Option func(*Server)
func WithPort(port int) Option { ... }
func NewServer(opts ...Option) *Server { ... }
7. Interface satisfaction implicite
type Writer interface { Write([]byte) (int, error) }
// myType implemente Writer si MyType a Write()
8. Accept interfaces, return structs
9. Prefer composition over inheritance (embedding)
10. Small interfaces (1-3 methods)
3.3 Idiomes de concurrence
11. "Share memory by communicating"
12. Done channel pattern
done := make(chan struct{})
go func() { work(); close(done) }()
<-done
13. Or-done channel
14. Fan-out, Fan-in
15. Context propagation
3.4 Idiomes de gestion d'erreurs
16. Check errors immediately
if err != nil { return err }
17. Always close/cleanup (defer)
f, _ := os.Open("file")
defer f.Close()
18. Error wrapping (Go 1.13+)
fmt.Errorf("opening file %s: %w", name, err)
19. Sentinel errors for expected errors
20. Type assertion with ok
if v, ok := i.(string); ok { ... }
3.5 Idiomes de testing
21. Table-driven tests
22. External test package
package mypkg_test
23. Test helpers
func setup(t *testing.T) *DB { t.Helper(); ... }
24. Subtests with t.Run
25. golden files for complex output
3.6 Idiomes avancés
26. sync.Once for lazy initialization
27. sync.Pool for temporary objects
28. Embedding for decoration
29. New vs Make distinction
30. init() functions avec parcimonie
Partie 4 : Common Mistakes - Top 20
| # | Mistake | Solution |
|---|---|---|
| 1 | Ignorer err != nil | Toujours vérifier les erreurs |
| 2 | Copier un sync.Mutex | Utiliser un pointeur receiver |
| 3 | Interface contenant un pointeur nil | Ne jamais mettre un pointeur nil dans une interface |
| 4 | Range loop variable capture | Créer une variable locale dans la boucle (avant Go 1.22) |
| 5 | Goroutine leaks | Toujours utiliser context.WithCancel ou un done channel |
| 6 | Fermer un channel deux fois | Panic ! Vérifier avec un sync.Once |
| 7 | Écrire dans une map nil | Panic ! Toujours faire make avant d'écrire |
| 8 | Slice aliasing avec append | Comprendre la capacité des slices |
| 9 | Defer dans une boucle | Les defers s'accumulent ! |
| 10 | Time.After dans une boucle | Utiliser time.NewTicker à la place |
| 11 | HTTP response body non fermé | Toujours defer resp.Body.Close() |
| 12 | Comparer des floats avec == | Utiliser une epsilon |
| 13 | Shadowing de variable | Go vet détecte ceci |
| 14 | Utiliser un receiver valeur avec Mutex | Panique ! Utiliser un pointeur |
| 15 | JSON avec champs non exportés | Les champs doivent être exportés (majuscule) |
| 16 | Croire que les maps sont ordonnées | Utiliser une slice de clés triées |
| 17 | Utiliser go sans synchronisation | Toujours utiliser WaitGroup ou channel |
| 18 | Oublier cancel() de context.WithCancel | Toujours defer cancel() |
| 19 | Utiliser init() pour la configuration | Préférer l'initialisation explicite |
| 20 | Benchmark sans b.ResetTimer() | Toujours reset avant la boucle de benchmark |
Annexes consultables rapidement pendant le développement. Imprimez les cheat sheets pour les garder à portée de main.