首页 > 解决方案 > 如何检查两个结构是否相等

问题描述

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

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

如何检查此结构的两个不同实例的相等性?是否仅通过使用反射?

标签: go

解决方案


虽然您可以使用反射,正如 Corey Ogburn 所建议的那样,但对于像这样的简单结构,我不会这样做。根据官方 Go 博客,反射是

一个强大的工具,除非绝对必要,否则应小心使用并避免使用

——反思法则

编写一个函数应该是一个简单的练习,该函数接受两个指向结构类型值的指针,并返回一个布尔值 true/false,以确定它们是否相等,首先测试 nil 指针,然后测试每个指针的相等性结构的字段。

time.Time值已经有一个带有签名的相等测试方法

func (t Time) Equal(u Time) bool

根据您的用例,更大的问题可能是比较两个浮点值是否相等。虽然==比较适用float64值,但对于许多应用程序,您希望两个浮点值在它们接近时被视为相等,以及它们完全相同时。如果您的应用程序是这种情况,我建议定义一个接受精度并验证两个值之间的差异不大于精度的相等函数。要了解更多信息,请研究十进制值的浮点表示。

请注意,time包文档对使用指针有这样的说法:

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

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


推荐阅读