如何检查两个结构是否相等

时间:2018-10-05 17:09:15

标签: go

我有这个结构的两个实例,里面有引用(作为属性):

type ST struct {
 some *float64
 createdAt *time.Time
}

如何对该结构的两个不同实例进行相等性检查?仅仅是使用反射吗?

2 个答案:

答案 0 :(得分:3)

虽然您可以使用反射as Corey Ogburn suggested,但对于这样的简单结构,我不会这样做。根据官方的Go Blog,反思是

  

一个功能强大的工具,应谨慎使用,除非绝对必要,否则应避免使用

-The Laws of Reflection

编写一个函数,该函数将两个指针指向您的struct类型的值,并返回关于它们是否相等的布尔值true / false,这应该是一个简单的练习,首先通过测试nil指针,然后通过测试结构中每个字段的相等性。

time.Time值已经具有签名的an equality test method

func (t Time) Equal(u Time) bool

根据您的用例,更大的问题可能是比较两个浮点值是否相等。在==float64值进行比较work的同时,对于许多应用程序,您希望两个浮点值在接近或完全相同时都被视为相等。如果是您的应用程序,则我建议定义一个相等的函数,该函数接受一个精度并验证两个值之间的差不大于精度。要了解更多信息,请研究十进制值的浮点表示形式。

请注意,time软件包文档中有say关于使用指针的内容:

  

使用时间的程序通常应将其存储并作为值(而不是指针)传递。也就是说,时间变量和结构字段的类型应为time.Time,而不是* time.Time。

因此,您可能应该在结构中更改createdAt的类型。

答案 1 :(得分:1)

您可以使用reflect.DeepEqual

  

DeepEqual报告x和y是否“深度相等”,定义如下。如果满足以下情况之一,则两个相同类型的值将非常相等。不同类型的值永远不会完全相等。

然后,文档继续描述如何将数组,结构,函数,指针和其他类型视为高度相等。