Go-time模块源码-理解并计算每月开始之前的天数 - 代码解析与应用

news/2024/12/4 23:35:16/

今天在看源码的时候看到了一个数组,感觉很莫名其妙,代码如下:

代码

// daysBefore[m] counts the number of days in a non-leap year
// before month m begins. There is an entry for m=12, counting
// the number of days before January of next year (365).
var daysBefore = [...]int32{0,31,31 + 28,31 + 28 + 31,31 + 28 + 31 + 30,31 + 28 + 31 + 30 + 31,31 + 28 + 31 + 30 + 31 + 30,31 + 28 + 31 + 30 + 31 + 30 + 31,31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31,
}

解释

源码有注释,翻译过来是说:

这段代码定义了一个名为 daysBefore 的整数类型数组,用于存储每个月份开始之前的天数总和。数组的索引表示月份,从 1 开始,对应的数组元素值表示该月份开始之前的天数总和。

代码注释中提到 daysBefore[m] 表示一个非闰年中,在月份 m 开始之前的天数总数。数组最后一个项 daysBefore[12] 是表示明年一月之前的天数总数(365天)。对于非闰年来说,每个月的天数是固定的,所以可以直接计算出来并用来初始化数组。

例如,daysBefore[1] 表示一月份之前的天数总和,因为一月份之前没有任何天数,所以值为 0。daysBefore[2] 表示二月份之前的天数总和,其中的值为 31,表示一月份的总天数为 31。daysBefore[3] 表示三月份之前的天数总和,其中的值为 31 + 28,表示一月份和二月份的总天数为 59(因为二月份有 28 天)。以此类推,可以计算出每个月份之前的天数总和。

通过使用这个数组,可以很方便地计算某一日期是一年中的第几天。例如,要计算一月份的第 15 天是一年中的第几天,可以通过 daysBefore[1] + 15 来得到结果。同样地,可以通过 daysBefore[m] + d 来计算任意一天是一年中的第几天,其中 m 表示月份,d 表示日期。

疑惑

上面数组给出了闰年的解决方案,那平年呢?

首先我们需要可以判断是否是闰年,代码如下:

func isLeap(year int) bool {return year%4 == 0 && (year%100 != 0 || year%400 == 0)
}

所以计算某一天是某一年的第几天的代码如下:

// Add in days before this month.
d += daysBefore[month-1]
if isLeap(year) && month >= March {d++ // February 29
}// Add in days before today.
d += day - 1

总结:

非常推荐大家看一看优秀项目的源码,有些代码一看可能会不知所云,但思考过后很大可能会有不小收获。

阅读 Go 源码有很多好处,无论是对于学习,提高技术能力还是贡献于开源社区都有积极的影响。以下是一些看 Go 源码的好处:

  1. 学习编程语言和编程范式:透过阅读 Go 的源码可以深入理解 Go 语言的设计原理、语法和特性。这有助于加深对语言本身的理解,同时也有助于掌握 Go 的编程范式和最佳实践。

  2. 学习标准库和框架:通常,标准库是学习任何编程语言的关键部分。通过阅读 Go 的标准库源码,可以学习到如何正确使用标准库中的各种功能和API,并且可以看到标准库的实现细节和设计哲学。此外,阅读框架的源码可以帮助理解框架的工作原理和使用方式,从而提高开发效率。

  3. 学习开发范式和设计模式:Go 的源码是非常优雅和高效的,它使用了很多现代开发范式和设计模式。通过阅读源码,可以学习到如何应用这些范式和模式来解决实际问题,提高代码的可维护性、可扩展性和性能。

  4. 深入了解底层实现:Go 使用了一些底层原语和技术,如并发编程、垃圾回收和网络编程等。通过阅读源码,可以了解这些底层实现的原理和机制,以及它们是如何与语言特性和标准库相互配合的。

  5. 解决问题和调试:阅读源码是解决问题和调试的有力工具。当你遇到问题或者 Bug 时,阅读相关源码可以帮助你更好地理解问题的根本原因,并找到解决问题的方法。此外,对于想要贡献于开源社区的人来说,阅读源码能够提高对项目的理解,从而更好地为项目做出贡献。

总而言之,阅读 Go 源码可以提高我们的编程技能和问题解决能力,加深对 Go 语言和标准库的理解,并且有助于贡献于开源社区。不过,阅读源码需要有一定的基础知识和经验,因此建议先对 Go 语言有一定的了解和应用经验,同时结合实践和探索,逐步提高对源码的理解能力。


http://www.ppmy.cn/news/660863.html

相关文章

web自动化测试:selenium怎么实现关键字驱动

要做 ui 自动化测试,使用关键字驱动可以说是必须会的一种测试方式,它既可以在纯代码的自动化程序中运行,也可以在测试平台中使用。 使用纯代码方式时,自动化工程师先写好一个通用的程序,其他手工测试人员只需要把执行…

施耐德、科士达、艾特网能等多品牌精密空调集中监控方案

管理范围大、效率低? 网点多,设备分散、距离远,不适合目前集中化管理的模式。传统人工管理效率低。 无法及时预知风险? 不能第一时间得知精密空调异常和告警,及时排除隐患和故障。难以及时发现精密空调存在的隐患。…

JS知识点汇总(五)--执行上下文

1. JavaScript中执行上下文和执行栈是什么? 1、执行上下文 执行上下文是一种对Javascript代码执行环境的抽象概念,也就是说只要有Javascript代码运行,那么它就一定是运行在执行上下文中 执行上下文的类型分为三种: 全局执行上…

集成测试、单元测试、系统测试之间的关系和区别

目录 前言 什么是集成测试? 什么是单元测试? 什么是系统集成测试? 集成测试与单元测试 系统测试与集成测试 总结: 前言 为了使软件正常工作,所有单元都应集成在一起并正常运行。集成测试就像是要求不同工种的工…

嵌入式常用软件/工具

工欲善其事,必先利其器。开发嵌入式或者其他的代码编写,有工具使用会好很多。以下总结几个常用的顺手工具: 1、Source Insight 快速查看代码,以及方便翻阅关联代码 2、Beyond Compare 比较代码文件和文件夹,用来改代码…

word中插入页码

选择“插入”选项卡,单击“页眉和页脚”组中的“页码”命令,打开“页码”下拉列表,在列表里选中页码插入的位置即可。 对页码的格式可以进行修改,单击“页码”下拉列表中的“设置页码格式”命令,打开“页码格式”对话框…

Word文档页码如何从第三页(或某一页)开始添加

背景 有时候写论文或者报告会要求页码从正文那一页再开始添加,经过自己的摸索尝试,终于找到了解决方法,如下所示。 解决方法 假若要从第三页开始添加页码 将光标定位到第二页的最末尾的位置,然后点击:布局->分割…

Word如何从中间页插入页码

Word如何从中间页插入页码 第一步-添加分节符 光标置于起始页码得上一页,点击【布局】->【分隔符】->【分节符下一页】 第二步-设置页码格式 点击【插入】->【页码】->【设置页码格式】 选中【起始页码】,设置起始页为‘1’ 第三步-…