如何比较结构体切片。

huangapple go评论79阅读模式
英文:

How to compare slice of struct

问题

type RecordProxy struct {
	Amt   int    `csv:"Amt"`
	Descr string `csv:"Descr"`
	Date  string `csv:"Date"`
	ID    string `csv:"ID"`
}

type RecordSource struct {
	Date        string `csv:"Date"`
	ID          string `csv:"ID"`
	Amount      int    `csv:"Amount"`
	Description string `csv:"Description"`
}

我有一个 []RecordProxy[]RecordSource 的结构体切片,我想检查这两个结构体切片是否相等。

你有什么想法吗?

英文:
type RecordProxy struct {
	Amt   int    `csv:"Amt"`
	Descr string `csv:"Descr"`
	Date  string `csv:"Date"`
	ID    string `csv:"ID"`
}

type RecordSource struct {
	Date        string `csv:"Date"`
	ID          string `csv:"ID"`
	Amount      int    `csv:"Amount"`
	Description string `csv:"Description"`
}

i have a slice of struct []RecordProxy and []RecordSource
i want to check if this 2 slice of struct is equal.

do you have any idea?

答案1

得分: 2

如@mkopriva所评论的“你必须实现自己的自定义比较方式”,即根据两个切片的规则来确定它们是否相等。

这只是一个示例:

func CompareRecords(a []RecordProxy, b []RecordSource) bool {
	lengthA, lengthB := len(a), len(b)
	if lengthA != lengthB {
		return false
	}

	for i := range a {
		// 定义自己的不相等规则:
		if a[i].Amt != b[i].Amount ||
			// 结构体字段的其他规则...
			a[i].Date != b[i].Date {
			return false
		}
	}

	return true
}
英文:

As @mkopriva comments "you have to implement your own custom way of comparing", i.e. tell what rules to according to the two slices could be considered equal.

Only an example:

func CompareRecords(a []RecordProxy, b []RecordSource) bool {
	lengthA, lengthB := len(a), len(b)
	if lengthA != lengthB {
		return false
	}

	for i := range a {
		// define your own unequal rules:
		if a[i].Amt != b[i].Amount ||
			// other rules for fields of structs...
			a[i].Date != b[i].Date {
			return false
		}
	}

	return true
}

答案2

得分: 0

比较结构体切片(a、b)的更好方法是使用反射:

if len(a) != len(b) {
    return false
}

flag := true
for i := 0; i < len(a); i++ {
    if reflect.DeepEqual(a[i], b[i]) {
        flag = true
    } else {
        flag = false
    }
}

// 验证 flag
if flag == false {
    return false
} else {
    return true
}

请注意,这段代码存在一些错误,我只是按照你提供的内容进行了翻译。

英文:

the better way to compare slice of structs ( a, b) is using reflect if

if len(a) != len(b) {
   return false
}

flag := true
for i:=0; len(a); i++{
    if reflect.DeepEqual(a[i], b[i]) {
      falg = true
   } else {
      flag = flase
   }
}
//verify flag
if flag == false{
  return false
} else {
 return true
}

huangapple
  • 本文由 发表于 2021年11月11日 12:39:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/69923263.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定