你有没有过这种体验?心血来潮想学点新东西,找了套视频教程,第一天跟着敲了三行代码,第二天就忘了文件夹放哪儿了,等到第三百六十五天回头一看,当初买的那门课连第一集都没看完,这不是你懒,是缺少一个能让你感知时间流逝的工具,今天我就用Go语言,手把手教你写一个能记录你从“第一天”到“第365天”学习轨迹的小程序,你不用是编程高手,跟着敲就行。
为什么是Go,而不是Python或JavaScript?
先别急着选语言,我得说清楚为什么我挑Go,Go的编译速度快得离谱,你敲完代码按运行,几乎感觉不到等待,更重要的是,Go的时间处理库(time包)设计得特别人性化,适合做“天数计算”这类活儿,而且Go生成的二进制文件直接就能跑,不用装一堆依赖,这对“坚持学习”这件事特别友好——因为你不用花半小时配环境。
第一步:搭个能跑起来的架子
打开你的终端,建个文件夹就叫day1-to-365,在里面创建一个main.go文件,先写上最基础的Hello World——不对,是“今天是第几天”的世界。
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println("当前时间:", now)
}
运行一下,看到输出了?好,你现在已经跑通了一个能感知“的程序,这比你看完第一集视频就关掉强多了——因为你亲手让电脑告诉你“现在几点”。
第二步:让程序知道你从哪天开始
每天学一个视频,总得有个起点,假设你是2025年1月1日开始这个计划的,我们把这个日期硬编码进去——别嫌糙,先跑通再说。
startDate := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
now := time.Now()
daysPassed := int(now.Sub(startDate).Hours() / 24)
fmt.Printf("你已经坚持了 %d 天\n", daysPassed)
这里用了一个小技巧:Sub方法返回两个时间点的差值,转换成小时再除以24,就是天数。注意,我这里用了取整,实际可能有小数点,但为了清晰,先这么做。
第三步:加个进度条,不然没动力
光知道数字没感觉,得可视化,我们来画个简单的文本进度条,用表示已完成的天数,用表示剩余的天数。
const totalDays = 365
progress := float64(daysPassed) / float64(totalDays) * 100
bar := ""
for i := 0; i < daysPassed && i < totalDays; i++ {
bar += "#"
}
for i := daysPassed; i < totalDays; i++ {
bar += "."
}
fmt.Printf("进度:%.1f%%\n", progress)
fmt.Printf("[%s]\n", bar)
这段代码有点粗糙——如果天数超过365,进度条会爆掉,但先别管,先感受一下“看见进度”的快感,你运行一次,看到那个在增多,真的会有种“我没白活”的错觉。
第四步:判断你今天该看哪个视频
假设你的视频列表是这样的:
| 天数区间 | 视频主题 | 难度 |
|---|---|---|
| 第1-7天 | Go语法基础 | 入门 |
| 第8-30天 | 并发编程 | 进阶 |
| 第31-90天 | Web服务 | 实战 |
| 第91-365天 | 源码分析 | 精通 |
我们写个函数,根据当前天数返回对应阶段:
func getVideoStage(day int) string {
switch {
case day <= 7:
return "Go语法基础(入门)"
case day <= 30:
return "并发编程(进阶)"
case day <= 90:
return "Web服务(实战)"
default:
return "源码分析(精通)"
}
}
然后在主函数里调用:
stage := getVideoStage(daysPassed)
fmt.Printf("今天应该学习:%s\n", stage)
这样,每一天你运行这个程序,它都会告诉你该看哪一阶段的视频。这不是预测,这是你亲手写出来的学习路线图。
第五步:加个提醒——别断更
坚持365天最难的是什么?不是学不会,是忘了,加个简单提醒:如果距离上次运行超过1天,就警告一下。
我们可以用文件记录上次运行的时间:

import (
"io/ioutil"
"strconv"
)
// 读取上次运行时间(以Unix时间戳存储)
data, err := ioutil.ReadFile("last_run.txt")
if err == nil {
lastRun, _ := strconv.ParseInt(string(data), 10, 64)
lastTime := time.Unix(lastRun, 0)
if now.Sub(lastTime).Hours() > 24 {
fmt.Println("⚠️ 你已经超过一天没学习了!")
}
}
// 记录当前时间
ioutil.WriteFile("last_run.txt", []byte(fmt.Sprintf("%d", now.Unix())), 0644)
这个功能有点简陋——如果文件被删了,警告就不起作用,但先用着,以后可以改成存到SQLite或者Redis,现在这个版本已经够你用了。
让程序每天自动执行
在Windows上可以用任务计划程序,Mac/Linux用cron,比如每天上午9点运行一次:
0 9 * * * /你的路径/day1-to-365
这样你都不用手动运行了,它会在每天早上告诉你今天该看哪个视频。这不比你自己记日历强?
真实使用体验
我写这个小工具的时候,其实犯了个错:我忘了处理闰年,2月29号那天,程序算出来的天数会差一天,后来我加了个判断:
if now.Month() == time.February && now.Day() == 29 {
daysPassed++ // 闰年多一天
}
你看,这不完美,但能跑起来、能解决问题、能让你坚持,比什么都重要,等你真的坚持到了第365天,你不仅学会了Go,还学会了怎么对付闰年、怎么用cron、怎么调试整数溢出。
我其实还想过要不要加个交互式界面,用gin框架搭个Web页面,但后来想通了:一个命令行工具,每天敲一次,反而更有仪式感,你打开终端,看到那个进度条往前挪了一点,听到风扇转了一下,就感觉今天没白过。
真正的学习不是看完所有视频,而是每天打开终端,敲下那三行命令,这个工具帮你记着日子,剩下的,就靠你自己了。
(对了,如果你坚持到第365天,记得把totalDays改成730,然后对自己说:“再来一年。”)
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/fnagchan/1793.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《一天到365天视频教学,用Golang写一个能陪你成长的时间感知工具》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:你有没有过这种体验?心血来潮想学点新东西,找了套视频教程,第一天跟着敲了三行代码,第二天就忘了文件夹放哪儿了,等到第三百六十五天回头一看...