Skip to content

Structures de données

Bien que le langage Go ait une syntaxe concise, il intègre plusieurs structures de données principales très puissantes. Ces structures de données sont les blocs de construction fondamentaux des programmes Go. Comprendre en profondeur leurs principes d'implémentation permet d'écrire du code plus efficace. Cet article présente les structures de données les plus couramment utilisées en Go et leurs implémentations sous-jacentes.

Structures de données de base

slice (Tranche)

Le slice est la structure de données la plus utilisée en Go. C'est une abstraction et une encapsulation des tableaux. Caractéristiques principales :

  • Taille dynamique : la longueur d'un slice peut croître dynamiquement
  • Sémantique de référence : lors du passage d'un slice, seule la structure est copiée, pas le tableau sous-jacent
  • Mécanisme d'expansion : lorsque la capacité est insuffisante, une expansion automatique a lieu

À l'exécution, un slice est représenté par la structure slice, contenant un pointeur vers le tableau sous-jacent, la longueur et la capacité.

string (Chaîne de caractères)

La chaîne de caractères est l'un des types de données les plus basiques en Go. Caractéristiques principales :

  • Immuabilité : une fois créée, une chaîne ne peut pas être modifiée
  • Encodage UTF-8 : généralement représente du texte encodé en UTF-8
  • Valeur zéro sûre : la valeur zéro d'une chaîne est la chaîne vide "", et non nil

À l'exécution, une chaîne est représentée par la structure stringStruct, contenant un pointeur vers un tableau d'octets et la longueur.

Structures de données conteneurs

map (Table de mappage)

map est un conteneur de paires clé-valeur intégré en Go, implémenté en interne avec une table de hachage. Caractéristiques principales :

  • Implémentation par table de hachage : localisation rapide des éléments via une fonction de hachage
  • Expansion automatique : expansion automatique lorsque le facteur de charge est trop élevé
  • Non thread-safe : la lecture/écriture concurrente nécessite des mécanismes de synchronisation supplémentaires

À l'exécution, une map est représentée par la structure hmap, contenant un tableau de buckets, une graine de hachage, un compteur d'éléments, etc.

syncmap (Map concurrente)

sync.Map est une map thread-safe fournie par la bibliothèque standard, adaptée aux scénarios avec beaucoup de lectures et peu d'écritures. Caractéristiques principales :

  • Séparation lecture/écriture : utilise deux maps (read et dirty) pour séparer les lectures et écritures
  • Opérations atomiques : la map read utilise des opérations atomiques sans verrouillage
  • Migration progressive : lorsque le compteur de miss atteint un seuil, dirty est promu en read

sync.Map utilise un compromis espace-temps pour offrir de meilleures performances que map + mutex dans certains scénarios.

Structures de données concurrentes

channel (Canal)

channel est la représentation typique de la philosophie CSP en Go, utilisé pour la communication entre goroutines. Caractéristiques principales :

  • Communication entre goroutines : transmission de données entre goroutines via channel
  • Mécanisme de synchronisation : un channel sans tampon peut être utilisé pour synchroniser des goroutines
  • File avec verrou : en interne, c'est une file circulaire avec verrou

À l'exécution, un channel est représenté par la structure hchan, contenant un tampon circulaire, des files d'attente, etc.

select (Multiplexage)

select permet de surveiller simultanément l'état de plusieurs channels, réalisant ainsi le multiplexage. Caractéristiques principales :

  • Non bloquant : peut vérifier de manière non bloquante si plusieurs channels sont disponibles
  • Choix aléatoire : quand plusieurs channels sont disponibles simultanément, un est choisi au hasard
  • Contrôle de timeout : combiné avec time.After pour implémenter des mécanismes de timeout

À l'exécution, select est représenté par la structure scase pour chaque branche, utilisant un mécanisme de sondage pour vérifier l'état des channels.

Recommandations d'apprentissage

Il est recommandé d'apprendre dans l'ordre suivant :

  1. Commencer par slice (Tranche) et string (Chaîne de caractères) pour comprendre les structures de données de base
  2. Ensuite apprendre map (Table de mappage) pour comprendre l'implémentation des tables de hachage
  3. Puis apprendre channel (Canal) pour comprendre les mécanismes de communication entre goroutines
  4. Continuer avec select (Multiplexage) pour maîtriser les techniques de multiplexage
  5. Enfin apprendre syncmap (Map concurrente) pour comprendre l'implémentation de la sécurité concurrente

Golang by www.golangdev.cn edit