Heim >Backend-Entwicklung >Golang >Warum schlägt die Division von „time.Duration' von Go durch eine Gleitkommazahl manchmal fehl?
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:
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)
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!