Maison  >  Article  >  développement back-end  >  Pourquoi mon alias de type d'heure personnalisé génère-t-il des résultats inattendus lors du démarshaling ?

Pourquoi mon alias de type d'heure personnalisé génère-t-il des résultats inattendus lors du démarshaling ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-28 17:12:02881parcourir

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

Sortie inattendue avec un alias de type horaire personnalisé

Lorsque vous essayez de désorganiser un alias de type horaire personnalisé, le résultat obtenu peut être inattendu. Considérez le code suivant :

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

En attendant l'heure formatée, la sortie affiche à la place ce qui suit :

&{958450000 63757163420 <nil>}

Cause fondamentale

Le problème réside dans l'implémentation manquante de fmt.Stringer pour le type Time. Par défaut, fmt utilise sa propre logique de formatage, qui affiche les champs de l'heure sous-jacente. Valeur de l'heure entre accolades.

Solutions

Pour résoudre ce problème, il existe deux options :

  1. Implémenter fmt.Stringer :

Ajouter une méthode String à votre type Time qui délègue à la méthode String de time.Time :

<code class="go">func (t Time) String() string {
    return time.Time(t).String()
}</code>
  1. Intégrer time.Time:

Modifiez le type d'heure pour intégrer time.Time au lieu de l'alias. Cela héritera automatiquement de la méthode String et de toutes les autres méthodes de time.Time :

<code class="go">type Time struct {
    time.Time
}</code>

Améliorations supplémentaires

  • Toujours utiliser json.Unmarshal pour décoder JSON chaînes pour éviter l'analyse manuelle.
  • Envisagez d'utiliser time.ParseInLocation pour un contrôle précis de l'interprétation du fuseau horaire :
<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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn