Я решил его использовать,
import java.util.logging.Logger;
import java.util.logging.Level;
Logger mongoLogger = Logger.getLogger( "org.mongodb.driver" );
mongoLogger.setLevel(Level.SEVERE); // e.g. or Log.WARNING, etc.
Прежде всего, я хотел бы рассмотреть объявление только одной структуры, поскольку поля в 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
}
Затем, наконец, вы можете исправить свою логику:
[112 ] Ваша логика предполагает, что длина a
всегда является правильным количеством для условной итерации. Игровая площадка, которой @FatchulAmin поделился в комментарии к ответу @EdChan, выявила проблему, когда a
больше, чем b
или наоборот, вы получите ошибку «index out of range», потому что меньший срез больше не будет иметь индексов чтобы соответствовать большему. a[i].TransactionDate == b[i].TransactionDate
Для здравомыслия, в этом случае вы должны выполнить проверку, чтобы найти наименьшее число для повторения, однако это не позволит вам полностью проверить все самые большие срезы.
Я предлагаю объединить срезы, а затем найти самый большой и наименьший диапазон, чтобы зациклить, чтобы удалить то, что вы хотите от слияния. ПРИМЕЧАНИЕ: @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 && largerSlice[j].TotalTransaction == "0" {
c.Remove(j)
}
}
}
return c
}
Полный рабочий пример: https://play.golang.org/p/iyUYtXlDG54