Heim >Backend-Entwicklung >Golang >Warum schlägt die Division von „time.Duration' von Go durch eine Gleitkommazahl manchmal fehl?

Warum schlägt die Division von „time.Duration' von Go durch eine Gleitkommazahl manchmal fehl?

Linda Hamilton
Linda HamiltonOriginal
2024-12-10 02:57:10873Durchsuche

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

Schlafen mit Gleitkomma-Dauerfraktionen

In Go kann das Teilen einer Zeitdauer durch einen Gleitkommawert zu unerwartetem Verhalten führen. Betrachten Sie das folgende Beispiel:

s := time.Hour / 73.0
fmt.Println("sleeping: ", s)
time.Sleep(s)

Dieser Code gibt erfolgreich die Dauer „1m38s12ms“ aus und versetzt das Programm für diese Zeit in den Ruhezustand. Dieser Code schlägt jedoch fehl:

d := 73.0
s := time.Hour / d
fmt.Println("sleeping: ", s)
time.Sleep(s)

Mit dem Fehler:

invalid operation: time.Hour / d (mismatched types time.Duration and float64)

Warum verhalten sich diese beiden Codes unterschiedlich?

Typsystem und Konstantenkonvertierung

Im ersten Code ist die Konstante 73.0 eine untypisierte numerische Konstante. Wenn es in Ausdrücken verwendet wird, konvertiert Go es basierend auf dem Kontext automatisch in den entsprechenden Typ. In diesem Fall ist time.Hour vom Typ time.Duration, daher wird 73,0 in time.Duration konvertiert.

Im zweiten Code wird d jedoch explizit als Typ float64 deklariert. Beim Teilen von time.Hour durch d versucht Go, eine Division zwischen time.Duration und float64 durchzuführen, was nicht zulässig ist.

Konvertierung in time.Duration

Zu machen Beim zweiten Code muss d in time.Duration konvertiert werden. Es gibt mehrere Möglichkeiten, dies zu erreichen:

  1. Explizite Konvertierung:
s := time.Hour / time.Duration(d)
  1. D als Zeit deklarieren. Dauer:
d := time.Duration(73.0)
s := time.Hour / d
  1. Verwenden Sie einen Typ Alias:
type Duration64 float64
d := Duration64(73.0)
s := time.Hour / time.Duration(d)

Bei der Konvertierung von Gleitkommawerten in time.Duration kann die Genauigkeit verloren gehen, wenn der Wert nicht mit int64 dargestellt werden kann. In diesen Fällen kann eine Umrechnung in die umgekehrte Richtung erforderlich sein:

s := time.Duration(float64(time.Hour) / d)

Das obige ist der detaillierte Inhalt vonWarum schlägt die Division von „time.Duration' von Go durch eine Gleitkommazahl manchmal fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn