#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. это всегда приведет к панике или не будет проходить через весь фрагмент, если только оба фрагмента не будут одинакового размера