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>
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>}}
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:
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>
Wenn diese Methode vorhanden ist, verwendet fmt die benutzerdefinierte Formatierungslogik beim Drucken des Benutzerwerts:
&{Name 2021-05-21 03:10:20.95845 +0000 UTC}
Alternativ können Sie time.Time direkt in Ihren Time-Typ einbetten:
<code class="go">type Time struct { time.Time }</code>
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!