Maison >développement back-end >Golang >Exemple d'analyse : Comment mettre en œuvre une coercition de structure efficace dans Golang

Exemple d'analyse : Comment mettre en œuvre une coercition de structure efficace dans Golang

WBOY
WBOYoriginal
2024-04-03 21:12:02719parcourir

En utilisant la bibliothèque « github.com/mailru/easyjson », vous pouvez obtenir une conversion forcée de structure efficace : installez la bibliothèque et utilisez easyjson pour générer le code de conversion forcée. Une fois le code généré, implémentez les méthodes MarshalJSON et UnmarshalJSON pour terminer la conversion de la structure en JSON et de JSON en structure. En utilisant le code généré, les performances du transfert forcé sont grandement améliorées tout en garantissant la lisibilité du code.

Exemple danalyse : Comment mettre en œuvre une coercition de structure efficace dans Golang

Comment implémenter une coercition de structure efficace en Golang

Dans le développement du langage Go, nous devons souvent convertir différents types de structures les unes aux autres. La méthode de conversion matérielle traditionnelle utilise la réflexion, mais cette méthode entraînera une perte de performances. Cet article présentera une méthode efficace de coercition de structure, utilisant l'outil go generate pour générer du code, évitant ainsi la surcharge de performances causée par la réflexion.

Bibliothèque de transfert forte à structure efficace

Nous devons d'abord installer une bibliothèque de transfert forte à structure efficace : "github.com/mailru/easyjson". Cette bibliothèque fournit des outils pour générer du code forcé.

Génération de code

Le code de transfert forcé généré à l'aide d'easyjson est le suivant :

package models

import (
    "github.com/mailru/easyjson/jwriter"
)

// MarshalJSON marshals the fields of Role to JSON.
func (r *Role) MarshalJSON() ([]byte, error) {
    w := jwriter.Writer{}
    r.MarshalEasyJSON(&w)
    return w.Buffer.BuildBytes(), w.Error
}

// MarshalEasyJSON marshals the fields of Role to JSON.
func (r *Role) MarshalEasyJSON(w *jwriter.Writer) {
    w.String(`{"id":`)
    w.Int64(r.ID)
    w.String(`,"name":`)
    w.String(r.Name)
    w.String(`,"description":`)
    w.String(r.Description)
    w.String(`,"created_at":`)
    w.String(r.CreatedAt.Format(`"2006-01-02T15:04:05"`))
    w.String(`,"updated_at":`)
    w.String(r.UpdatedAt.Format(`"2006-01-02T15:04:05"`))
    w.String(`}`)
}

// UnmarshalJSON unmarshals JSON data into the fields of Role.
func (r *Role) UnmarshalJSON(data []byte) error {
    r.ID = 0
    r.Name = ""
    r.Description = ""
    r.CreatedAt = time.Time{}
    r.UpdatedAt = time.Time{}
    return easyjson.Unmarshal(data, &r)
}

Cas pratique

Ce qui suit est un cas pratique du code de transfert forcé généré à l'aide d'easyjson :

package main

import (
    "encoding/json"
    "fmt"

    "github.com/mailru/easyjson"
    models "github.com/your-name/your-project/models"
)

func main() {
    role := &models.Role{
        ID:          1,
        Name:        "admin",
        Description: "Administrator role",
    }

    // Encode to JSON using the generated MarshalJSON method
    jsonData, err := json.Marshal(role)
    if err != nil {
        fmt.Println("Error encoding JSON:", err)
        return
    }

    fmt.Println("JSON data:", string(jsonData))

    // Decode from JSON using the generated UnmarshalJSON method
    newRole := &models.Role{}
    if err := easyjson.Unmarshal(jsonData, newRole); err != nil {
        fmt.Println("Error decoding JSON:", err)
        return
    }

    fmt.Println("Decoded role:", newRole)
}

En utilisant le code généré par easyjson, nous pouvons améliorer considérablement les performances de coercition de structure tout en gardant le code lisible et maintenable.

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