Maison >développement back-end >Golang >Comment puis-je convertir efficacement des cartes en structures dans 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!