Warum erzeugt mein Zeittyp-Alias ​​in Go beim Drucken eine unerwartete Ausgabe?

Barbara Streisand
Freigeben: 2024-10-30 05:35:28
Original
562 Leute haben es durchsucht

 Why Does My Time Type Alias in Go Produce Unexpected Output When Printed?

Unerwartete Ausgabe mit time.Time Type Alias

In Go bietet die UnmarshalJSON-Methode für benutzerdefinierte Typen die Möglichkeit, die JSON-Werte anzupassen ungeordnet. Ein beliebter Anwendungsfall ist die Änderung der Darstellung von Zeitwerten. Wenn Sie jedoch einen Typalias für time.Time verwenden, muss darauf geachtet werden, die erwartete Ausgabe sicherzustellen.

Beachten Sie den folgenden Codeausschnitt:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "strings"
    "time"
)

type Time time.Time // Custom type alias for `time.Time`

func (st *Time) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), "\"")
    t, err := time.Parse(time.RFC3339, fmt.Sprintf("%sZ", s))
    if err != nil {
        return fmt.Errorf("parse time: %w", err)
    }
    *st = Time(t)
    return nil
}

type User struct {
    Name string
    TS Time // Field of type `Time`
}</code>
Nach dem Login kopieren

In diesem Beispiel ein benutzerdefiniertes UnmarshalJSON Die Methode ist für den Time-Typ definiert, um eine JSON-Zeichenfolgendarstellung in einen time.Time-Wert zu konvertieren. Beim Parsen der JSON-Zeichenfolge hängt die Methode den Buchstaben „Z“ an das Ende an, um sicherzustellen, dass die Zeitzone auf UTC eingestellt ist.

Wenn Sie jedoch versuchen, den nicht gemarshallten Benutzerwert mit fmt.Printf zu drucken, werden Sie Möglicherweise fällt eine unerwartete Ausgabe auf:

&{Name {958450000 63757163420 <nil>}}
Nach dem Login kopieren

Diese Ausgabe ist irreführend, da sie den Zeitwert nicht eindeutig darstellt.

Der Grund für dieses Verhalten liegt in der Art und Weise, wie Go benutzerdefinierte Typen formatiert. Das fmt-Paket verfügt über eine Standardformatierungslogik für integrierte Typen, bei benutzerdefinierten Typen greift es jedoch auf das Drucken der Felder des zugrunde liegenden Typs zurück. In diesem Fall ist Time ein Typalias für time.Time, sodass fmt beim Formatieren die zugrunde liegenden Felder von time.Time ausgibt, was zu einer verwirrenden Ausgabe führt.

Lösungen

Um dieses Problem zu lösen, können Sie einen von zwei Ansätzen wählen:

  1. Implementieren Sie die fmt.Stringer-Schnittstelle:

Definieren Sie eine String-Methode für Ihren Time-Typ, der an die String-Methode von time.Time delegiert:

<code class="go">func (t Time) String() string {
    return time.Time(t).String()
}</code>
Nach dem Login kopieren

Wenn diese Methode vorhanden ist, verwendet fmt die benutzerdefinierte Formatierungslogik beim Drucken des Benutzerwerts:

&{Name 2021-05-21 03:10:20.95845 +0000 UTC}
Nach dem Login kopieren
  1. time.Time einbetten:

Alternativ können Sie time.Time direkt in Ihren Time-Typ einbetten:

<code class="go">type Time struct {
    time.Time
}</code>
Nach dem Login kopieren

Dieser Ansatz erbt alle Methoden von time.Time, einschließlich der String-Methode, die die erwartete Ausgabe während der Formatierung sicherstellt.

Ein weiterer wichtiger Gesichtspunkt bei der Arbeit mit Zeitwerten ist die Verwendung des Pakets „encoding/json“ für JSON-Marshalling und -Unmarshaling. Das manuelle Parsen von JSON-Strings kann zu Fehlern oder einer falschen Datenverarbeitung führen.

Das obige ist der detaillierte Inhalt vonWarum erzeugt mein Zeittyp-Alias ​​in Go beim Drucken eine unerwartete Ausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!