Dormir avec des fractions de durée à virgule flottante
Dans Go, diviser une durée par une valeur à virgule flottante peut entraîner un comportement inattendu. Prenons l'exemple suivant :
s := time.Hour / 73.0 fmt.Println("sleeping: ", s) time.Sleep(s)
Ce code imprime avec succès la durée "1m38s12ms" et met le programme en veille pendant cette durée. Cependant, ce code échoue :
d := 73.0 s := time.Hour / d fmt.Println("sleeping: ", s) time.Sleep(s)
Avec l'erreur :
invalid operation: time.Hour / d (mismatched types time.Duration and float64)
Pourquoi ces deux codes se comportent-ils différemment ?
Système de type et conversion constante
Dans le premier code, la constante 73.0 est une constante numérique non typée. Lorsqu'il est utilisé dans des expressions, Go le convertit automatiquement en type approprié en fonction du contexte. Dans ce cas, time.Hour est de type time.Duration, donc 73.0 est converti en time.Duration.
Cependant, dans le deuxième code, d est explicitement déclaré comme type float64. Lors de la division de time.Hour par d, Go tente d'effectuer une division entre time.Duration et float64, ce qui n'est pas autorisé.
Conversion en time.Duration
Pour faire le deuxième code fonctionne, d doit être converti en time.Duration. Il existe plusieurs façons d'y parvenir :
s := time.Hour / time.Duration(d)
d := time.Duration(73.0) s := time.Hour / d
type Duration64 float64 d := Duration64(73.0) s := time.Hour / time.Duration(d)
Lors de la conversion de valeurs à virgule flottante en time.Duration, la précision peut être perdue si la valeur ne peut pas être représentée avec int64. Dans ces cas, une conversion dans le sens inverse peut être nécessaire :
s := time.Duration(float64(time.Hour) / d)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!