Arrays 替换Golang中数组结构中的数据

Arrays 替换Golang中数组结构中的数据,arrays,go,struct,Arrays,Go,Struct,我有3个结构数据(GOLANG),我称之为A,B,和C,结构C是结构A和B之间的结果数组替换,当数据相似或大于0时,我使用数组将所有结果设置为结构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}

我有3个结构数据(GOLANG),我称之为AB,和C,结构C是结构A和B之间的结果数组替换,当数据相似或大于0时,我使用数组将所有结果设置为结构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
}
func compareReplace()[]C{
var a[]a
变量b[]b
变量c[]c
对于i:=0;i

<>或者我们可以在

中合作,首先,我认为只声明一个结构,因为<>代码> 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 comparerereplace(a[]FooBar,b[]FooBar)[]FooBar{
var c[]foobar
对于i:=0;i
最后,您可能需要修复您的逻辑:

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
}
func comparerereplace(a[]FooBar,b[]FooBar)[]FooBar{
var c[]foobar
对于i:=0;i
您的逻辑假定
a
的长度始终是有条件地迭代的正确计数。@FatchulAmin在对@EdChan answer的评论中分享的操场暴露了当
a
大于
b
或反之亦然时的问题,您将得到“索引超出范围”错误,因为较小的片段将不再具有与较大片段匹配的索引<代码>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
}
输入FooBar结构{
TransactionDate字符串
总金额字符串
TotalTransaction字符串
}
键入FooBarSlice[]FooBar//这用作func Remove上的接收器
函数比较替换(a[]FooBar,b[]FooBar)[]FooBar{
var c FooBarSlice
c=附加(a,b…)
var largerSlice[]FooBar
var smallerSlice[]FooBar

如果len(a)我尝试了它,但在b中找不到索引,请注意,如果len(a)>len(b),函数compareReplace将死机。除非两个片的大小相同,否则这将始终死机或不在整个片上循环