Arrays 替换Golang中数组结构中的数据
我有3个结构数据(GOLANG),我称之为A,B,和C,结构C是结构A和B之间的结果数组替换,当数据相似或大于0时,我使用数组将所有结果设置为结构CArrays 替换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}
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将死机。除非两个片的大小相同,否则这将始终死机或不在整个片上循环