当前位置:首页 > 汽车 > 正文

用Go语言,我给自己搭了个365天天都精彩视频打卡站

  • 汽车
  • 2026-08-09 12:30:25
  • 49
摘要: 我这人有个毛病,收藏夹里躺着几百个“必看”视频,结果一年到头打开的不到十个,上个月翻出来一看,好家伙,去年存的“减脂餐教程”都快...

我这人有个毛病,收藏夹里躺着几百个“必看”视频,结果一年到头打开的不到十个,上个月翻出来一看,好家伙,去年存的“减脂餐教程”都快过期了,于是我用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.Printlnlog.Fatal一步步试错,有次半夜起来看板子,发现数据库文件损坏了——因为我直接拔了电源,没关进程,后来加了个defer db.Close()sigint处理,才算消停。

你说这玩意儿有多高级?真没有,但它真的让我坚持下来了,因为每次打开页面,那个“距离今年结束还有X天”的计数器就在那儿亮着,看着数字一天天变小,你就忍不住想,今天这个“精彩”,到底存不存?

其实工具是死的,人是活的,Go语言给了你一个趁手的扳手,你天天用它拧一颗螺丝钉,拧着拧着,一年就过去了,那365天天都精彩的,不是视频,是你自己挑出来的那些瞬间,最后说一句,代码写完记得go build,然后就丢在后台跑着吧,别管它了。

用Go语言,我给自己搭了个365天天都精彩视频打卡站