Comment réussir un entretien Go : questions et réponses avancées

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment réussir un entretien Go : les meilleures questions de niveau avancé

Un entretien pour un poste de développeur Go ne se limite pas à vérifier la syntaxe. Au niveau avancé, les recruteurs souhaitent voir une compréhension approfondie de la concurrence, de la gestion de la mémoire, du fonctionnement de l'ordonnanceur et des idiomes du langage. Dans cet article, nous analysons les questions clés souvent posées aux ingénieurs senior, avec des exemples de code et des explications. Ce contenu sera utile aussi bien pour la préparation que pour la systématisation des connaissances.



1. Concurrence : goroutines, canaux et primitives de synchronisation

Go est réputé pour son support intégré de la concurrence. Les recruteurs vérifient presque toujours comment le candidat comprend la différence entre les goroutines et les threads du système d'exploitation, ainsi que sa capacité à utiliser correctement les canaux et le package sync.



Question : Quelle est la différence entre une goroutine et un thread du système d'exploitation ?

Une goroutine est un thread léger géré par l'ordonnanceur Go (modèle G-M-P). Elle possède sa propre pile, qui commence à 2-4 Ko et peut croître dynamiquement. Un thread du système d'exploitation est un objet lourd avec une pile fixe (généralement 1-8 Mo). Des milliers de goroutines peuvent fonctionner sur un seul thread du système d'exploitation, ce qui rend leur lancement et leur commutation très économiques.



Question : Comment éviter une condition de course (data race) lors du travail avec des goroutines ?

Utilisez des canaux pour transmettre des données entre goroutines ("Ne communiquez pas en partageant la mémoire ; partagez plutôt la mémoire en communiquant") ou des mutex (sync.Mutex, sync.RWMutex). Vérifiez toujours le code avec le flag -race.

var counter intvar mu sync.Mutex

func increment() { mu.Lock() counter++ mu.Unlock()}


Question : Expliquez le principe de fonctionnement de select. Que se passe-t-il si tous les canaux sont bloqués ?

select permet à une goroutine d'attendre plusieurs opérations de canal simultanément. Si tous les canaux sont bloqués, select attendra jusqu'à ce que l'un d'eux devienne prêt. S'il y a un default, il sera exécuté immédiatement, empêchant le blocage.

select {case msg := <-ch1:    fmt.Println("Reçu de ch1 :", msg)case ch2 <- "data":    fmt.Println("Envoyé à ch2")default:    fmt.Println("Aucun canal n'est prêt")}


2. Gestion de la mémoire et ramasse-miettes (GC)

Pour un niveau avancé, il est important de comprendre comment fonctionne l'allocation en Go, où les variables sont placées (pile/tas) et comment le ramasse-miettes affecte les performances.



Question : Comment Go décide-t-il de placer une variable sur la pile ou dans le tas ?

Go utilise une analyse d'échappement (escape analysis). Si le compilateur peut prouver que la variable n'est pas utilisée après le retour de la fonction (ne "s'échappe" pas), elle est placée sur la pile. Sinon, elle est placée dans le tas. Par exemple, le retour d'un pointeur vers une variable locale la force à "s'échapper" vers le tas.

func createUser() *User {    u := User{Name: "Alice"}    return &u // échappement vers le tas}


Question : Comment fonctionne le ramasse-miettes en Go ? Quelles phases traverse-t-il ?

Le GC en Go est un ramasse-miettes parallèle tricolore (mark-sweep). Il traverse trois phases :

  • Mark Setup (STW) : un court arrêt du monde pour activer la barrière d'écriture (write barrier).
  • Marking : phase parallèle qui marque les objets vivants. Fonctionne avec l'application.
  • Sweep : nettoyage de la mémoire inutilisée, généralement différé.

Le temps STW (Stop The World) est généralement inférieur à 500 µs, ce qui rend Go adapté aux applications sensibles à la latence.



Question : Comment réduire la charge sur le GC ?

  • Évitez les allocations fréquentes (utilisez des pools d'objets sync.Pool).
  • Réutilisez les slices avec slice[:0].
  • Augmentez la valeur de

Blogs

Book Recommendations