Heim > Backend-Entwicklung > Golang > Warum gibt mein benutzerdefinierter Zeittyp-Alias ​​beim Unmarshaling unerwartete Ergebnisse aus?

Warum gibt mein benutzerdefinierter Zeittyp-Alias ​​beim Unmarshaling unerwartete Ergebnisse aus?

Mary-Kate Olsen
Freigeben: 2024-10-28 17:12:02
Original
952 Leute haben es durchsucht

Why Does My Custom Time Type Alias Output Unexpected Results When Unmarshaling?

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>
Nach dem Login kopieren

Da eine formatierte Zeit erwartet wird, zeigt die Ausgabe stattdessen Folgendes an:

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

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:

  1. Implementieren Sie fmt.Stringer:

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>
Nach dem Login kopieren
  1. time.Time einbetten:

Ä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>
Nach dem Login kopieren

Zusätzliche Verbesserungen

  • Verwenden Sie immer json.Unmarshal, um JSON zu dekodieren Zeichenfolgen, um manuelles Parsen zu vermeiden.
  • Erwägen Sie die Verwendung von time.ParseInLocation für eine präzise Kontrolle über die Zeitzoneninterpretation:
<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>
Nach dem Login kopieren

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!

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