MFormations
Modern Go Engineering

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

TermeDéfinition
anyAlias pour interface{} (Go 1.18+)
ArgumentValeur passée à un appel de fonction
ArraySéquence de taille fixe d'éléments du même type
AssignmentOpération qui donne une valeur à une variable
AtomicOpération non-interruptible, thread-safe
Automatic semicolonRègle d'insertion automatique du point-virgule

B

TermeDéfinition
BenchmarkTest de performance mesuré avec testing.B
Blank identifier_ (underscore), ignore la valeur retournée
BlockSéquence de déclarations et statements entre {}
BreakStatement qui sort d'une boucle ou d'un switch
Buffered channelChannel avec capacité de stockage (file d'attente)
Build constraintCondition pour inclure/exclure un fichier lors du build
Build tagSynonyme de build constraint
ByteAlias pour uint8
BSSSegment mémoire pour les variables globales non initialisées

C

TermeDéfinition
CallInvocation d'une fonction
CapCapacité d'une slice ou d'un channel
CgoMécanisme pour appeler du code C depuis Go
ChannelPrimitive de communication entre goroutines
ClosureFonction qui capture des variables de sa portée englobante
ComparableContrainte générique autorisant == et !=
Composite literalSyntaxe pour créer des valeurs de types composites
ConstDéclaration de constante
ContextPackage pour la propagation de délais, annulations et valeurs
ContinueStatement qui passe à l'itération suivante d'une boucle
CopyFonction intégrée pour copier des éléments entre slices
CSPCommunicating Sequential Processes (Hoare)
CoverageMesure de la proportion de code testé

D

TermeDéfinition
Data raceAccès concurrent non synchronisé à une variable partagée
DeadlockSituation où des goroutines s'attendent mutuellement
DeferReporte l'exécution d'un appel de fonction au retour
DependencyModule ou package requis par le code
DirectoryDossier contenant des fichiers source Go
Duck typingUn type satisfait une interface s'il a les méthodes requises
Dynamic typeLe type concret stocké dans une interface

E

TermeDéfinition
Ellipsis... pour paramètres variadiques ou expansion de slice
EmbedDirective //go:embed pour inclure des fichiers dans le binaire
EmbeddingInclusion d'un type dans une structure (composition)
Empty interfaceinterface{} ou any, accepte tout type
ErrorInterface prédéfinie avec Error() string
Escape analysisDétermine si une variable est allouée sur le heap
ExportIdentifiant commençant par une majuscule
ExpressionCombinaison d'opérandes et d'opérateurs

F

TermeDéfinition
FallthroughStatement qui passe au cas suivant dans switch
Fan-inPattern de concurrence qui fusionne plusieurs channels
Fan-outPattern de concurrence qui distribue le travail
FlagPackage standard pour analyser les arguments CLI
FloatTypes flottants : float32, float64
ForUnique mot-clé de boucle en Go
FuncMot-clé pour déclarer une fonction
FuzzingTest automatisé avec des entrées aléatoires

G

TermeDéfinition
Garbage CollectorRamasse-miettes concurrent (tri-color mark-and-sweep)
GenericsParamètres de type (Go 1.18+)
GofmtOutil de formatage automatique du code
GOMAXPROCSNombre maximum de threads OS pour les goroutines
GOPATHAncien système de workspace (remplacé par modules)
GOROOTChemin d'installation du compilateur Go
GoroutineFil d'exécution léger, ~2KB de stack initiale
Go toolSuite d'outils intégrés (build, test, vet, pprof)
GOPROXYProxy de modules Go
GOSUMDBBase de sommes de checksums des modules

H

TermeDéfinition
HandleFonction qui traite une requête HTTP
HandlerInterface http.Handler avec ServeHTTP
HeapMémoire allouée dynamiquement (gérée par le GC)
HTTP/2Protocole HTTP/2 supporté nativement

I

TermeDéfinition
IdentifieurNom d'une entité (variable, fonction, type)
IfStatement conditionnel
ImportDéclaration pour utiliser un package externe
InliningOptimisation du compilateur qui substitue l'appel
IntType entier (taille dépend de la plateforme)
InterfaceEnsemble de méthodes définissant un contrat
Interface embeddingComposition d'interfaces
Interface valuePaire (type concret, valeur concrète)
IterateParcourir les éléments d'une collection
ioutilPackage déprécié (remplacé par io/os depuis Go 1.16)

J

TermeDéfinition
JSONFormat d'échange de données supporté par encoding/json

K

TermeDéfinition
KeyClé dans une map ou un struct
KeywordMot réservé du langage (25 mots-clés)

L

TermeDéfinition
LenFonction intégrée pour la longueur d'une collection
LinterOutil d'analyse statique du code
LiteralReprésentation littérale d'une valeur
LivenessPointeur vers une valeur encore active (GC)
LogPackage pour l'enregistrement de logs
LoopBoucle de répétition (seulement for)

M

TermeDéfinition
M:N schedulingModèle M goroutines sur N threads OS
MakeFonction intégrée pour créer slices, maps, channels
MapCollection associative (clé -> valeur)
MarshalConversion d'une structure en JSON/Protobuf
MethodFonction avec un récepteur
Method setEnsemble des méthodes d'un type
MiddlewareFonction qui enveloppe un handler HTTP
ModuleCollection de packages Go versionnés
MutexVerrou d'exclusion mutuelle (sync.Mutex)

N

TermeDéfinition
Named resultParamètre de retour nommé dans une fonction
NewFonction intégrée pour allouer (retourne un pointeur)
NilValeur zéro pour les pointeurs, slices, maps, channels, interfaces, fonctions
NopNo-operation (io.Discard, http.HandlerFunc)

O

TermeDéfinition
Oncesync.Once : exécute une fonction une seule fois
OverflowDépassement de capacité d'un type entier
OmitemptyTag JSON pour omettre les champs vides

P

TermeDéfinition
PackageCollection de fichiers source dans un même dossier
PanicErreur runtime qui déroule la pile d'appels
ParameterVariable dans la déclaration d'une fonction
PipelineChaîne d'étapes connectées par des channels
PointerVariable contenant l'adresse mémoire d'une autre variable
Poolsync.Pool pour réutiliser des objets temporaires
pprofOutil de profilage CPU et mémoire
PreemptionInterruption d'une goroutine par le scheduler
ProtobufProtocol Buffers (sérialisation binaire)
ProxyServeur intermédiaire pour les modules Go

Q

TermeDéfinition
QueryRequête SQL
QueueFile d'attente (implémentable avec channel)

R

TermeDéfinition
Race detectorOutil intégré pour détecter les data races
RangeMot-clé pour itérer sur une collection
ReceiverParamètre spécial d'une méthode (valeur ou pointeur)
RecoverFonction pour reprendre après une panic
ReflectionIntrosection des types à l'exécution
RuneAlias pour int32, représente un point de code Unicode
RWMutexMutex avec lecture/écriture (sync.RWMutex)

S

TermeDéfinition
SchedulerOrdonnanceur des goroutines (M:N)
ScopePortée de visibilité d'un identifieur
SelectStatement pour attendre sur plusieurs channels
ShadowingMasquage d'une variable par une autre de même nom
Short declaration:= déclare et initialise une variable
SliceVue dynamique sur un tableau (ptr, len, cap)
StackPile mémoire (chaque goroutine a sa stack)
StringChaîne de caractères UTF-8 immuable
StructType composé de champs nommés
SwitchStatement de sélection multi-cas
SyncPackage de synchronisation (Mutex, WaitGroup, Once, Cond)

T

TermeDéfinition
Table-driven testTest paramétré avec un tableau de cas
TickerTimer périodique (time.Ticker)
TimerTimer unique (time.Timer)
TraceOutil de traçage d'exécution
TypeDéclaration de type ou mot-clé
Type assertionx.(T) pour extraire le type concret d'une interface
Type switchSwitch sur le type dynamique d'une interface

U

TermeDéfinition
Unbuffered channelChannel sans capacité (synchronisation)
UnicodeStandard d'encodage de caractères
UnmarshalDésérialisation JSON/Protobuf
UnsafePackage pour les opérations non typées
UDPProtocole de transport non fiable
UUIDIdentifiant unique universel

V

TermeDéfinition
ValueDonnée concrète stockée dans une variable
Value receiverMéthode qui reçoit une copie de la valeur
VarMot-clé pour déclarer une variable
VariableZone mémoire nommée contenant une valeur
VetOutil d'analyse statique (go vet)
ViperBibliothèque de gestion de configuration

W

TermeDéfinition
WaitGroupsync.WaitGroup pour attendre des goroutines
Worker poolPattern avec N goroutines partageant un channel de jobs
Write barrierMécanisme du GC pour maintenir la cohérence du marquage

X-Z

TermeDéfinition
YAMLFormat de sérialisation lisible
Zero valueValeur par défaut d'un type (0, "", nil, false)
Zombie goroutineGoroutine qui fuit (jamais terminée)
1.18Version ayant introduit les generics
1.21Version avec min, max, clear, slog stabilisé
1.22Version avec amélioration du for loop, range over int
1.23Version 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

#MistakeSolution
1Ignorer err != nilToujours vérifier les erreurs
2Copier un sync.MutexUtiliser un pointeur receiver
3Interface contenant un pointeur nilNe jamais mettre un pointeur nil dans une interface
4Range loop variable captureCréer une variable locale dans la boucle (avant Go 1.22)
5Goroutine leaksToujours utiliser context.WithCancel ou un done channel
6Fermer un channel deux foisPanic ! Vérifier avec un sync.Once
7Écrire dans une map nilPanic ! Toujours faire make avant d'écrire
8Slice aliasing avec appendComprendre la capacité des slices
9Defer dans une boucleLes defers s'accumulent !
10Time.After dans une boucleUtiliser time.NewTicker à la place
11HTTP response body non ferméToujours defer resp.Body.Close()
12Comparer des floats avec ==Utiliser une epsilon
13Shadowing de variableGo vet détecte ceci
14Utiliser un receiver valeur avec MutexPanique ! Utiliser un pointeur
15JSON avec champs non exportésLes champs doivent être exportés (majuscule)
16Croire que les maps sont ordonnéesUtiliser une slice de clés triées
17Utiliser go sans synchronisationToujours utiliser WaitGroup ou channel
18Oublier cancel() de context.WithCancelToujours defer cancel()
19Utiliser init() pour la configurationPréférer l'initialisation explicite
20Benchmark 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.