Home >Backend Development >Golang >How Can I Efficiently Convert a Go Map to a Struct Without Using JSON?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-12-20 22:26:14858browse

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

Converting Map to Struct Without JSON

In Go, you can encounter scenarios where you need to convert a map to a struct. While JSON can serve as an intermediary method, it may not be the most efficient approach. Here's how you can achieve this conversion:

One straightforward alternative is employing the powerful mapstructure library from GitHub. By importing it, you can leverage its Decode() functionality as follows:

import "github.com/mitchellh/mapstructure"

mapstructure.Decode(myData, &result)

For a hands-on implementation, consider the following approach:

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)
}

By using reflection and the custom SetField() function, this code iterates over the map's entries and sets the corresponding struct fields, providing a versatile solution for converting maps to structs in Go.

The above is the detailed content of How Can I Efficiently Convert a Go Map to a Struct Without Using JSON?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn