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
Mary-Kate OlsenOriginal
2024-10-28 17:12:02949Durchsuche

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>

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:

  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>
  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>

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>

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!

Stellungnahme:
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