我有3个结构数据(GOLANG),分别称为 A , B 和 C C是当数据相似或大于0时在结构A和结构B之间替换结果数组,然后使用数组将所有结果设置为结构C。
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
}
进行合作
答案 0 :(得分:0)
您的逻辑假定a
的长度始终是正确的有条件迭代的计数。当a
大于b
时,@ FatchulAmin在对@EdChan答案的评论中共享的游乐场暴露了该问题,反之亦然,您会收到“索引超出范围”错误,因为较小的切片不再有匹配更大的索引。 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
}
答案 1 :(得分:-1)
首先,我将考虑仅声明一个结构,因为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
}