我有这个结构的两个实例,里面有引用(作为属性):
type ST struct {
some *float64
createdAt *time.Time
}
如何对该结构的两个不同实例进行相等性检查?仅仅是使用反射吗?
答案 0 :(得分:3)
虽然您可以使用反射as Corey Ogburn suggested,但对于这样的简单结构,我不会这样做。根据官方的Go Blog,反思是
一个功能强大的工具,应谨慎使用,除非绝对必要,否则应避免使用
编写一个函数,该函数将两个指针指向您的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是否“深度相等”,定义如下。如果满足以下情况之一,则两个相同类型的值将非常相等。不同类型的值永远不会完全相等。
然后,文档继续描述如何将数组,结构,函数,指针和其他类型视为高度相等。