Comment multiplier Duration par Integer en Go ? Analyse avec exemples
\n\nBonjour, collègue ! Si tu as déjà écrit du code Go qui gère des minuteurs, des intervalles ou simplement des délais, tu as sûrement rencontré cette question. Tu prends un time.Duration, tu veux le multiplier par un nombre entier — et tu obtiens une erreur de compilation. Ça te dit quelque chose ? Ne t'inquiète pas, c'est l'une des questions les plus populaires sur Stack Overflow avec des milliers de vues. Dans cet article, nous allons voir pourquoi cela se produit et comment résoudre correctement le problème en 2025. C'est parti !
Pourquoi time.Duration * int ne fonctionne-t-il pas ?
\nAllons droit au but. En Go, time.Duration n'est pas simplement un nombre, mais un type distinct, basé sur int64 (nanosecondes). Quand tu écris :
package main\n\nimport (\n "fmt"\n "time"\n)\n\nfunc main() {\n d := 2 * time.Second\n multiplier := 3\n result := d * multiplier // Erreur de compilation !\n fmt.Println(result)\n}\n\nLe compilateur affichera quelque chose comme : invalid operation: d * multiplier (mismatched types time.Duration and int). En Go, le typage est strict, et on ne peut pas multiplier directement des types différents. C'est une protection contre les erreurs stupides, mais parfois agaçant. En 2025, cette règle n'a pas changé, et il faut la contourner correctement.
Meilleures pratiques : comment multiplier Duration par Integer
\nIl existe plusieurs méthodes, et nous allons examiner chacune. Choisis celle qui convient le mieux à ton problème.
\n\n1. Conversion de int en time.Duration
\nLa méthode la plus évidente et la plus sûre est de convertir le multiplicateur en type time.Duration. Comme time.Duration est un int64, la conversion fonctionne directement :
package main\n\nimport (\n "fmt"\n "time"\n)\n\nfunc main() {\n d := 2 * time.Second\n multiplier := 3\n result := d * time.Duration(multiplier)\n fmt.Println(result) // Affichage : 6s\n}\n\nCette méthode est idéale lorsque le multiplicateur est un petit nombre positif. Mais attention : si multiplier est négatif ou très grand, le résultat peut être inattendu (dépassement de capacité). En 2025, cela reste d'actualité, donc vérifie les valeurs limites.
2. Utilisation de time.Duration pour les calculs
\nParfois, il est plus pratique de travailler directement avec des constantes time.Duration. Par exemple, si tu dois augmenter un intervalle plusieurs fois :
package main\n\nimport (\n "fmt"\n "time"\n)\n\nfunc main() {\n base := 500 * time.Millisecond\n multiplier := time.Duration(4)\n result := base * multiplier\n fmt.Println(result) // Affichage : 2s\n}\n\nCette approche est plus lisible, surtout si le multiplicateur est une constante. Mais n'oublie pas que time.Duration est en nanosecondes, donc time.Duration(4) correspond à 4 nanosecondes, et non à 4 unités de temps. Pour une multiplication par « 4 fois », cela fonctionne, mais pas pour d'autres usages.
3. Fonction d'encapsulation pour plus de commodité
\nSi la multiplication de duration par int est fréquente dans le code, crée une petite fonction. Cela améliorera la lisibilité et évitera les duplications :
\npackage main\n\nimport (\n "fmt"\n "time"\n)\n\nfunc multiplyDuration(d time.Duration, factor int) time.Duration {\n return d * time.Duration(factor)\n}\n\nfunc main() {\n d := 3 * time.Minute\n result := multiplyDuration(d, 2)\n fmt.Println(result) // Affichage : 6m0s\n}\n\nEn 2025, alors que les projets deviennent plus complexes, ces fonctions auxiliaires sont indispensables. Elles protègent contre les erreurs et rendent le code auto-documenté.
\n\n4. Multiplication avec virgule flottante (niveau avancé)
\nParfois, tu dois multiplier une duration par un nombre fractionnaire (par exemple, 1.5). Go ne permet pas de multiplier time.Duration par float64, mais on peut ruser :
package main\n\nimport (\n "fmt"\n "time"\n)\n\nfunc main() {\n d := 100 * time.Millisecond\n factor := 1.5\n result :=