Maison >développement back-end >Golang >Comment puis-je convertir efficacement une Go Map en une structure sans utiliser JSON ?

Comment puis-je convertir efficacement une Go Map en une structure sans utiliser JSON ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-20 22:26:14812parcourir

How Can I Efficiently Convert a Go Map to a Struct Without Using JSON?

Conversion d'une carte en structure sans JSON

Dans Go, vous pouvez rencontrer des scénarios dans lesquels vous devez convertir une carte en structure. Bien que JSON puisse servir de méthode intermédiaire, ce n’est peut-être pas l’approche la plus efficace. Voici comment réaliser cette conversion :

Une alternative simple consiste à utiliser la puissante bibliothèque mapstructure de GitHub. En l'important, vous pouvez exploiter sa fonctionnalité Decode() comme suit :

import "github.com/mitchellh/mapstructure"

mapstructure.Decode(myData, &result)

Pour une implémentation pratique, envisagez l'approche suivante :

package main

import (
    "fmt"
    "reflect"
)

type MyStruct struct {
    Name string
    Age  int64
}

func SetField(obj interface{}, name string, value interface{}) error {
    structValue := reflect.ValueOf(obj).Elem()
    structFieldValue := structValue.FieldByName(name)

    if !structFieldValue.IsValid() {
        return fmt.Errorf("No such field: %s in obj", name)
    }

    if !structFieldValue.CanSet() {
        return fmt.Errorf("Cannot set %s field value", name)
    }

    structFieldType := structFieldValue.Type()
    val := reflect.ValueOf(value)
    if structFieldType != val.Type() {
        return errors.New("Provided value type didn't match obj field type")
    }

    structFieldValue.Set(val)
    return nil
}

func (s *MyStruct) FillStruct(m map[string]interface{}) error {
    for k, v := range m {
        err := SetField(s, k, v)
        if err != nil {
            return err
        }
    }
    return nil
}

func main() {
    myData := make(map[string]interface{})
    myData["Name"] = "Tony"
    myData["Age"] = int64(23)

    result := &MyStruct{}
    err := result.FillStruct(myData)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(result)
}

En utilisant la réflexion et le Fonction personnalisée SetField(), ce code parcourt les entrées de la carte et définit les champs de structure correspondants, fournissant une solution polyvalente pour convertir des cartes en structures dans Go.

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