Сопоставление между структурами в цикле

# #loops #go #struct

Вопрос:

У меня есть функция, которая выполняет некоторое сопоставление между 2 структурами:

 Struct1 => Struct2
 

где Struct1 происходит следующее:

 type Struct1 struct {
A Transaction `json:"transaction"`
B string      `json:"name"`
...

}
 

в то Struct2 время как выглядит так:

 type Struct2 struct {
C AnotherTransaction `json:"transaction"`
D string      `json:"name"`
...

}
 

У меня есть функция , которая отображает «внутренний» тип Transaction => AnotherTransaction , но проблема в том, что существует внешняя структура, названная Struct3 для удобства следующим образом:

 type Struct3 struct {
    Failed   []Struct2 `json:"failed"` // a list of transactions
    Success  []Struct2 `json:"success"`
}

func mapTo(st3 Struct3) Struct1 {
  st1 := Transaction{}
  // the mapping between A => C is quite lengthy
  st1.someField = st3.struct2.anotherField

  return st1 // now mapped

}
 

Моя проблема в том, что из структуры 3 мне нужно получить доступ к каждому элементу структуры 2 и запустить функцию сопоставления выше, но я не уверен, как это сделать. Как я могу перебрать каждый элемент []Struct2 добавления каждого элемента и вернуть Struct3 теперь заполненное сопоставление с mapTo() ?

Ответ №1:

Вы можете обновить аргумент функции map до struct2 и выполнить цикл по полям массива struct3 из main функции и отправить каждое из них в toMap функцию.

 func main() {
    type Struct3 struct {
        Failed   []Struct2 `json:"failed"` // a list of transactions
        Success  []Struct2 `json:"success"`
    }
    s3 := amp;Struct3{
        Failed: make([]Struct2, 0),
        Success: make([]Struct2, 0),
    }

    for i := range s3.Success {
        // do something with the result value
        _ = toMap(s3.Success[i])
    }

    for i := range s3.Failed {
        // do something with the result value
        _ = toMap(s3.Failed[i])
    }
}

func mapTo(st2 Struct2) Struct1 {
  st1 := Transaction{}
  // the mapping between A => C is quite lengthy
  st1.someField = st2.anotherField

  return st1 // now mapped

}