Maison > développement back-end > Golang > 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
Libérer: 2024-10-28 17:12:02
original
958 Les gens l'ont consulté

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>
Copier après la connexion

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

&{958450000 63757163420 <nil>}
Copier après la connexion

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>
Copier après la connexion
  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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal