Maison >développement back-end >Golang >Comment puis-je convertir efficacement des cartes en structures dans Go ?

Comment puis-je convertir efficacement des cartes en structures dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-29 16:54:12869parcourir

How Can I Efficiently Convert Maps to Structs in Go?

Conversion de cartes en structures dans Go : approches efficaces

Remplir des structures avec des données provenant de cartes dans Go peut être une tâche courante, et utiliser un la conversion JSON intermédiaire peut sembler inefficace. Heureusement, il existe des moyens plus efficaces d'accomplir cette transformation.

Une approche hautement recommandée consiste à tirer parti du package polyvalent « mapstructure » ​​de Mitchell Hashimoto. Avec ce package, vous pouvez simplement invoquer :

import "github.com/mitchellh/mapstructure"

mapstructure.Decode(myData, &result)

Cette syntaxe élégante décodera la carte myData dans le résultat de la structure avec un minimum de complications.

Si vous préférez une approche plus DIY, vous pouvez suivez la solution complète décrite dans l'extrait de code ci-dessous :

func SetField(obj interface{}, name string, value interface{}) error {
    // Get a handle on the struct value and field
    structValue := reflect.ValueOf(obj).Elem()
    structFieldValue := structValue.FieldByName(name)

    // Check validity and permissions for the operation
    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)
    }

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

    // Update the field value within the struct instance
    structFieldValue.Set(val)

    return nil
}

type MyStruct struct {
    Name string
    Age  int64
}

func (s *MyStruct) FillStruct(m map[string]interface{}) error {
    // Iterate over map keys and values, setting corresponding struct fields
    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)
}

Ce code gérera méticuleusement les recherches de champs, les vérifications de type et la valeur affectations pour réaliser la conversion de map en struct.

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