Maison >développement back-end >Golang >Pourquoi la division de « time.Duration » de Go par un nombre à virgule flottante échoue-t-elle parfois ?

Pourquoi la division de « time.Duration » de Go par un nombre à virgule flottante échoue-t-elle parfois ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-10 02:57:10970parcourir

Why Does Dividing Go's `time.Duration` by a Floating-Point Number Sometimes Fail?

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 :

  1. Conversion explicite :
s := time.Hour / time.Duration(d)
  1. Déclarez d comme heure.Durée :
d := time.Duration(73.0)
s := time.Hour / d
  1. Utiliser un type alias :
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn