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
Libérer: 2024-12-10 02:57:10
original
879 Les gens l'ont consulté

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)
Copier après la connexion

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)
Copier après la connexion

Avec l'erreur :

invalid operation: time.Hour / d (mismatched types time.Duration and float64)
Copier après la connexion

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)
Copier après la connexion
  1. Déclarez d comme heure.Durée :
d := time.Duration(73.0)
s := time.Hour / d
Copier après la connexion
  1. Utiliser un type alias :
type Duration64 float64
d := Duration64(73.0)
s := time.Hour / time.Duration(d)
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal