用Go语言,我给自己搭了个365天天都精彩视频打卡站
- 汽车
- 2026-08-09 12:30:25
- 41
我这人有个毛病,收藏夹里躺着几百个“必看”视频,结果一年到头打开的不到十个,上个月翻出来一看,好家伙,去年存的“减脂餐教程”都快过期了,于是我用Go语言,花了一下午,给自己写了个小工具——“365天天都精彩视频”,不是让你每天看什么,是每天必须存一个觉得“今天最值”的视频进去,这玩意儿不复杂,但真管用,下面我把思路和代码掰开揉碎了讲给你听,你也能自己整一个。
为什么非得用Go?因为我懒
选Go不是我矫情,Python写脚本也快,但最后我还得装环境、管依赖,Go不一样,编译出来一个二进制文件,扔哪儿都能跑,Windows、Linux、Mac,一行命令搞定,而且Go的net/http标准库,开个本地服务器那叫一个顺手,你不需要什么框架,几行代码就能把网页端、存储、逻辑全串起来。
最关键的是,Go的并发模型让我想起来就开心——我后台挂个定时器,每天凌晨自动把昨天的“精彩视频”标签归档,顺便生成个周报,这要是用别的主流后端语言,我得额外配置任务队列,麻烦了去了。
第一步:数据结构——就一张表,多一句废话都不写
我建了个SQLite数据库(用的modernc.org/sqlite,纯Go实现,不用CGO,编译出来直接扔树莓派上都能跑),表结构长这样:
CREATE TABLE videos (
id INTEGER PRIMARY KEY AUTOINCREMENT,TEXT NOT NULL,
url TEXT NOT NULL,
tag TEXT DEFAULT '未分类',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
note TEXT
);
字段就五个:标题、链接、标签、添加时间、备注,没搞外键,没搞索引优化(数据量撑死一年365条,犯不上)。你说你天天都想看“精彩”,但你不记录下来,那跟没看过有啥区别?
第二步:核心逻辑——一个http.Handler搞定一切
Go的http.HandleFunc是灵魂,我注册了三个路由:
- — 展示所有记录,按日期倒序
/add— 提交新视频(GET显示表单,POST处理入库)/stats— 看本周/本月存了多少条
你别笑,就这么简陋,但配合html/template模板,页面出来还挺像回事儿,我在页面上加了个随机播放按钮——点击就从数据库里捞一条没看过的,直接跳转,你想啊,365天天都精彩,但你要是天天按顺序看,那叫“补作业”,不叫“看精彩”,随机才有惊喜。
代码核心长这样:
func addVideoHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet {
tmpl.ExecuteTemplate(w, "add.html", nil)
return
}
// POST:解析表单,插入数据库:= r.FormValue("title")
url := r.FormValue("url")
tag := r.FormValue("tag")
note := r.FormValue("note")
// 简单校验:URL必须非空且以http开头
if !strings.HasPrefix(url, "http") {
http.Error(w, "URL格式不对", http.StatusBadRequest)
return
}
_, err := db.Exec("INSERT INTO videos (title, url, tag, note) VALUES (?,?,?,?)", title, url, tag, note)
// ...错误处理省略
http.Redirect(w, r, "/", http.StatusSeeOther)
}
看着是不是特眼熟?就是最基础的CRUD,但真的够用了,我甚至没加用户系统,因为这东西就我自己用,顶多老婆凑个热闹。
第三步:那个“每天一个”的仪式感怎么来?
光有增删查改太无趣,我写了个小函数,每天中午12点整,程序自动往数据库里塞一条“今日占位符”——标题叫“今天还没存,想偷懒吗?”,URL指向一个空链接,然后我打开页面,第一眼看到的就是这条刺眼的提醒。
更好玩的是,我加了条规则:如果晚上11点前,这条占位符的URL还是空的,程序就自动从“稍后观看”列表里抓一条最旧的视频补进去,标签打上“系统救急”,你还别说,这么搞了两个星期,我愣是补了三天缺,后来我学乖了,每天刷到什么好玩的,顺手就五秒钟存进去。
用Go实现这个定时任务,一个time.Ticker就完事了:
func dailyCheck() {
ticker := time.NewTicker(1 * time.Hour)
for range ticker.C {
now := time.Now()
if now.Hour() == 23 && now.Minute() >= 0 {
// 执行占位符补救逻辑
fillMissingVideo()
}
}
}
没用什么cron库,没搞分布式锁,就是一个goroutine,说实话,写程序有时候跟过日子一样,想得太复杂反而坚持不下去。
表格看看我的“精彩”分布
上周我导出了前30天的数据,用Go写了个简单的统计,输出长这样:
| 时间段 | 数量 | 最爱标签 | 平均备注长度 |
|---|---|---|---|
| 第一周 | 6 | 美食 | 12字 |
| 第二周 | 5 | 技术教程 | 8字 |
| 第三周 | 2 | 搞笑 | 3字 |
| 第四周 | 17 | 纪录片 | 25字 |
看到没?第四周我存得最多,因为那阵子迷上了深海的纪录片。数据不会骗人,你对啥上心,看都看得出来。
这玩意儿值不值得你照抄?
你要是也想搞这么个“365天天都精彩视频”打卡站,我提几个建议:
- 别做太复杂,别加标签多选、别搞搜索、别排优先级,就一个输入框放URL,一个输入框放标题,够你用的。
- 用Go的
embed把模板嵌进去,这样编译出来的就是单个可执行文件,随身带着走。 - 数据库备份就复制文件,SQLite的好处就是单文件,每天写个脚本
cp videos.db backups/完事。
我写这套东西,没看任何教程,纯粹靠fmt.Println和log.Fatal一步步试错,有次半夜起来看板子,发现数据库文件损坏了——因为我直接拔了电源,没关进程,后来加了个defer db.Close()和sigint处理,才算消停。
你说这玩意儿有多高级?真没有,但它真的让我坚持下来了,因为每次打开页面,那个“距离今年结束还有X天”的计数器就在那儿亮着,看着数字一天天变小,你就忍不住想,今天这个“精彩”,到底存不存?
其实工具是死的,人是活的,Go语言给了你一个趁手的扳手,你天天用它拧一颗螺丝钉,拧着拧着,一年就过去了,那365天天都精彩的,不是视频,是你自己挑出来的那些瞬间,最后说一句,代码写完记得go build,然后就丢在后台跑着吧,别管它了。
