Maison > Article > développement back-end > Exemple d'analyse : Comment mettre en œuvre une coercition de structure efficace dans Golang
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.
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!