Unerwartete Ausgabe mit benutzerdefiniertem Zeittyp-Alias
Beim Versuch, ein benutzerdefiniertes Zeittyp-Alias zu entmarshalieren, kann die resultierende Ausgabe unerwartet sein. Betrachten Sie den folgenden Code:
<code class="go">type Time time.Time func main() { // Simplified unmarshal code for brevity st := Time(time.Parse(time.RFC3339, "2021-05-21T03:10:20.958450Z")) fmt.Printf("%v\n", st) }</code>
Da eine formatierte Zeit erwartet wird, zeigt die Ausgabe stattdessen Folgendes an:
&{958450000 63757163420 <nil>}
Grundursache
Das Problem liegt in der fehlenden Implementierung von fmt.Stringer für den Time-Typ. Standardmäßig verwendet fmt eine eigene Formatierungslogik, die die Felder des zugrunde liegenden time.Time-Werts in geschweiften Klammern anzeigt.
Lösungen
Um dieses Problem zu beheben, gibt es zwei Optionen:
Fügen Sie Ihrem Time-Typ eine String-Methode hinzu, die an die String-Methode von time.Time delegiert :
<code class="go">func (t Time) String() string { return time.Time(t).String() }</code>
Ändern Sie den Time-Typ, um time.Time einzubetten, anstatt ihn mit einem Alias zu versehen. Dadurch werden automatisch die String-Methode und alle anderen Methoden von time.Time geerbt:
<code class="go">type Time struct { time.Time }</code>
Zusätzliche Verbesserungen
<code class="go">func (st *Time) UnmarshalJSON(b []byte) error { var s string if err := json.Unmarshal(b, &s); err != nil { return err } t, err := time.ParseInLocation("2006-01-02T15:04:05", s, time.UTC) if err != nil { return err } *st = Time(t) return nil }</code>
Das obige ist der detaillierte Inhalt vonWarum gibt mein benutzerdefinierter Zeittyp-Alias beim Unmarshaling unerwartete Ergebnisse aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!