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