Pourquoi j'ai réécrit mon projet en Go
Après des mois de maintenance d'un outil CLI en Node.js, j'ai décidé de le réécrire en Go. Voici pourquoi cette décision avait du sens et ce que j'ai appris en cours de route.
Le problème avec Node.js pour les outils CLI
Ne vous méprenez pas — Node.js est fantastique pour beaucoup de choses. Mais pour les outils CLI qui doivent être distribués comme des binaires autonomes, il présente certains défis :
- Complexité de distribution : Les utilisateurs ont besoin de Node.js installé, ou vous devez regrouper tout le runtime
- Temps de démarrage : Les démarrages à froid peuvent être lents, surtout avec beaucoup de dépendances
- Taille du binaire : Les exécutables groupés peuvent être massifs
Pourquoi Go ?
Go résout ces problèmes élégamment :
package main
import "fmt"
func main() {
fmt.Println("Bonjour, CLI!")
}
Ceci compile en un seul binaire statique qui s'exécute partout. Aucun runtime requis.
Avantages clés
- Compilation rapide — Le compilateur Go est incroyablement rapide
- Cross-compilation — Construisez pour n'importe quelle plateforme depuis n'importe quelle plateforme
- Excellente bibliothèque standard — La plupart des choses dont vous avez besoin sont intégrées
- Primitives de concurrence — Les goroutines rendent les opérations parallèles simples
Le processus de migration
J'ai abordé la réécriture de manière incrémentale :
- Commencé avec les structures de données principales
- Porté l'analyse des arguments de ligne de commande (utilisant Cobra)
- Migré les opérations du système de fichiers
- Ajouté des tests pour chaque composant
Résultats
Après la réécriture :
- Taille du binaire : 8MB (contre 45MB regroupé)
- Temps de démarrage : ~10ms (contre ~500ms)
- Aucune dépendance externe pour les utilisateurs
Conclusion
Go n'est pas le bon choix pour chaque projet, mais pour les outils CLI, il est difficile à battre. La combinaison d'une distribution facile, d'excellentes performances et d'une grande expérience développeur en fait mon choix de prédilection pour ce type de travail.