Заменить данные в структуре массива в Golang

#arrays #go #struct

#массивы #Вперед #структура

Вопрос:

У меня есть 3 структуры данных (GOLANG), которые я вызываю A, B и C, структура C — это результат замены массива между структурами A и B, когда данные похожи или больше 0, тогда я устанавливаю весь результат в структуру C, используя array.

 Struct A, B, C {
 TransactionDate  string 
 TotalAmount      string 
 TotalTransaction string 
}

A = [
     {2019-02-01 0 0} 
     {2019-02-02 0 0} 
     {2019-02-03 0 0} 
     {2019-02-04 0 0} 
     {2019-02-05 0 0} 
     {2019-02-06 0 0} 
     {2019-02-07 0 0}
   ]

B = [
     {2019-02-02 1000 2} 
     {2019-02-07 200 3}
    ]
  

Я ожидаю, что результат будет похож

 C = [
     {2019-02-01 0 0} 
     {2019-02-02 1000 2} 
     {2019-02-03 0 0} 
     {2019-02-04 0 0} 
     {2019-02-05 0 0} 
     {2019-02-06 0 0} 
     {2019-02-07 200 3}
  ]
  

Я пытаюсь использовать подобное, но мне все еще не нравится ожидаемый результат, можете ли вы помочь мне решить это?

 func compareReplace() []C{
 var a []A
 var b []B
 var c []C   
 for i := 0; i < len(a); i   { 
  if a[i].TransactionDate == b[i].TransactionDate {
        if b[i].TotalTransaction != "0" {
            c = append(c, b[i])
        }
  }
 }

 return c
}
  

Или мы можем сотрудничать в https://play.golang.org/p/H-aaolvSDZt

Ответ №1:

Ваша логика предполагает, что длина a всегда является правильным количеством для условной итерации. Игровая площадка, которой @FatchulAmin поделился в комментарии к ответу @EdChan, выявила проблему, когда a значение больше b или наоборот, вы получите ошибку «индекс вне диапазона», потому что меньший фрагмент больше не будет иметь индексов, соответствующих большему. a[i].TransactionDate == b[i].TransactionDate

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

Я предлагаю объединить фрагменты, затем найти самый большой и самый маленький для range и выполнить цикл, чтобы удалить то, что вы хотите, из объединенного. ПРИМЕЧАНИЕ: @EdChan прав, используя одну структуру, поскольку все они одинаковы.

 type FooBar struct {
    TransactionDate  string
    TotalAmount      string
    TotalTransaction string
}

type FooBarSlice []FooBar // this is used as a receiver on func Remove

func compareReplace(a []FooBar, b []FooBar) []FooBar {
    var c FooBarSlice
    c = append(a, b...)


    var largerSlice []FooBar
    var smallerSlice []FooBar
    if len(a) <= len(b) {
        largerSlice = b
        smallerSlice = a
    } else {
        largerSlice = a
        smallerSlice = b
    }

    for _, v := range smallerSlice {

        for j := 0; j < len(largerSlice); j   {
            if largerSlice[j].TransactionDate == v.TransactionDate amp;amp; largerSlice[j].TotalTransaction == "0" {

                c.Remove(j)

            }
        }
    }

    return c
}
  

Полный рабочий пример: https://play.golang.org/p/iyUYtXlDG54

Ответ №2:

Прежде всего, я бы рассмотрел возможность объявления только одной структуры, поскольку поля A , B и C совпадают. Например:

 type FooBar struct {
    TransactionDate  string 
    TotalAmount      string 
    TotalTransaction string 
}
  

Затем для вашей функции вы можете попробовать переписать ее в:

 func compareReplace(a []FooBar, b []FooBar) []FooBar{
 var c []foobar
 for i := 0; i < len(a); i   { 
  if a[i].TransactionDate == b[i].TransactionDate {
        if b[i].TotalTransaction != "0" {
            c = append(c, b[i])
        }
  }
 }
 return c
}
  

Тогда, наконец, вы, возможно, захотите исправить свою логику:

 func compareReplace(a []FooBar, b []FooBar) []FooBar{
 var c []foobar
 for i := 0; i < len(a); i   { 
  if a[i].TransactionDate == b[i].TransactionDate {
        if b[i].TotalTransaction != "0" {
            c = append(c, b[i])
        } 
  } else {
    // You might want to append a[i] if the date is mismatching
    c = append(c, b[i])
  }
 }
 return c
}
  

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

1. Я пробую, но индекс не найден в b, давайте проверим play.golang.org/p/H-aaolvSDZt

2. Обратите внимание, что функция compareReplace будет паниковать, если len(a) > len(b).

3. это всегда приведет к панике или не будет проходить через весь фрагмент, если только оба фрагмента не будут одинакового размера