go - 如何检查两个结构是否相等
问题描述
我有这个结构的两个实例,里面有引用(作为属性):
type ST struct {
some *float64
createdAt *time.Time
}
如何检查此结构的两个不同实例的相等性?是否仅通过使用反射?
解决方案
虽然您可以使用反射,正如 Corey Ogburn 所建议的那样,但对于像这样的简单结构,我不会这样做。根据官方 Go 博客,反射是
一个强大的工具,除非绝对必要,否则应小心使用并避免使用
——反思法则
编写一个函数应该是一个简单的练习,该函数接受两个指向结构类型值的指针,并返回一个布尔值 true/false,以确定它们是否相等,首先测试 nil 指针,然后测试每个指针的相等性结构的字段。
time.Time
值已经有一个带有签名的相等测试方法
func (t Time) Equal(u Time) bool
根据您的用例,更大的问题可能是比较两个浮点值是否相等。虽然==
比较适用于float64
值,但对于许多应用程序,您希望两个浮点值在它们接近时被视为相等,以及它们完全相同时。如果您的应用程序是这种情况,我建议定义一个接受精度并验证两个值之间的差异不大于精度的相等函数。要了解更多信息,请研究十进制值的浮点表示。
请注意,time
包文档对使用指针有这样的说法:
使用时间的程序通常应该将它们作为值而不是指针来存储和传递。也就是说,时间变量和结构字段的类型应该是 time.Time,而不是 *time.Time。
因此,您可能应该更改createdAt
结构中的类型。
推荐阅读
- python - 通过信号量进行线程同步后无法同时运行三个线程
- apache-spark - 从 Spark 结构化流作业写入时的增量表版本控制
- java - Java File Watcher 无法识别文件更改
- sql - 如何向所有在餐厅举行多次会议的客户展示
- php - 从数组打印 Html 表格
- tensorflow - 导入 TensorFlow Probability 的问题
- windows - Go SDK更新修改默认安装路径
- php - 从选择下拉列表中选择随机选项
- sql - 如何从 Oracle 时间戳值中仅提取时间分量?
- javascript - 我如何让 Magit 与 Commitizen 合作?