Как преобразовать всю вложенную структуру в карту

#dictionary #go #struct

#словарь #Вперед #структура

Вопрос:

У меня есть сценарий, в котором я должен преобразовать всю структуру в карту. Я знаю, что у нас есть библиотека structs.Карта (ы), которая преобразует структуру в карту. Но я хочу знать, есть ли способ, с помощью которого я могу преобразовать несколько структур внутри struct в интерфейс map [string]. например, мы имеем ниже

 package main

import (
    "log"

    "github.com/fatih/structs"
)

type Community struct {
    Name        string   `json:"name,omitempty"`
    Description string   `json:"description,omitempty"`
    Sources     []Source `json:"sources,omitempty"`
    Moderators  []string `json:"moderators,omitempty"`
}

type Source struct {
    SourceName string  `json:"sourceName,omitempty"`
    Region []State `json:"region,omitempty"`
}

type State struct {
    State1 string `json:"state1,omitempty"`
    State2 string `json:"state2,omitempty"`
}

func main() {

    compareData := Community{
        Name:        "A",
        Description: "this belong to A community",
        Sources: []Source{
            {
                SourceName: "SourceA",
                Region: []State{
                    {
                        State1: "State1",
                    },
                    {
                        State2: "State2",
                    },
                },
            },
        },
    }
    m := structs.Map(compareData)
    log.Println(m)
}
  

это даст результат, как показано ниже, то есть он снова создает карту для внутренней структуры

 map[Description:this belong to A community 
Moderators:[] 
Name:A Sources:[map[SourceName:SourceA Region:[map[State1:State1 State2:] map[State1: State2:State2]]]]]
  

я ожидаю получить только один интерфейс map [string]{}

 map[
Description:this belong to A community 
Moderators:[] 
Name:A 
SourceName:SourceA 
State1:State1 
State2:State2
]
  

моя цель создания единой карты — сравнить значение с другой картой на основе ключа.
Моя структура также варьируется в зависимости от другого ответа, поэтому я хочу иметь карту, на которой я могу получить все пары ключ-значение для удобства сравнения. Если у кого-то есть предложения по этому поводу, пожалуйста, дайте мне знать.

Комментарии:

1. Используйте reflect.DeepEqual() для сравнения либо исходных структур, либо вложенных карт, созданных на их основе.

2. Ключи на карте ДОЛЖНЫ быть уникальными, поэтому Name:A рядом Name:SourceA в map[string]interface{} просто никогда не произойдет.

3. Я думаю, что лучший способ — использовать вложенное сравнение в структурах, а не просто конвертировать в карту

4. да, ключи должны быть уникальными, это всего лишь пример, который я написал, чтобы попасть в единую карту

Ответ №1:

Вы можете использовать mapstructure package.

Пример использования :

 package main

import (
    "fmt"
    "github.com/mitchellh/mapstructure"
)

func main() {

    type Emails struct {
        Mail []string
    }

    type Person struct {
        Name   string
        Age    int
        Emails Emails
        Extra  map[string]string
    }



    // This input can come from anywhere, but typically comes from
    // something like decoding JSON where we're not quite sure of the
    // struct initially.
    mails := []string{"foo@bar.com", "foo2@bar.com"}
    input := Person{
        Name:   "foo",
        Age:    25,
        Emails: Emails{Mail: mails},
        Extra:  map[string]string{"family": "bar"},
    }

    result := map[string]interface{}{}

    err := mapstructure.Decode(input, amp;result)
    if err != nil {
        panic(err)
    }

    fmt.Printf("%#v", result)
}


  

игровая площадка