Go轻量RSS阅读器用gofeed解析多格式源,time.Ticker定时抓取,JSON/SQLite存储并去重,支持CLI(cobra)或Web(net/http+模板)展示。

在 Go 语言中开发一个轻量级 RSS 阅读器,核心是解析 RSS/Atom 源、定期抓取更新、本地存储并提供简单展示(命令行或 Web)。不依赖复杂框架,用标准库和少量成熟第三方包就能实现。
1. 解析 RSS/Atom 订阅源
RSS 和 Atom 是两种主流格式,结构不同但目标一致:描述文章标题、链接、发布时间、摘要等。Go 标准库没有原生支持,推荐使用 github.com/mmcdole/gofeed —— 它统一处理 RSS 2.0、RSS 1.0、Atom 0.3/1.0,自动识别格式,API 简洁。
示例代码:
fp := gofeed.NewParser()
feed, err := fp.ParseURL("https://example.com/feed.xml")
if err != nil {
log.Fatal(err)
}
for _, item := range feed.Items {
fmt.Printf("- %s\n %s\n %s\n", item.Title, item.Link, item.Published)
}注意:item.Published 是 time.Time 类型,可直接比较新旧;若为空,可 fallback 到 item.Updated 或生成时间。
立即学习“go语言免费学习笔记(深入)”;
2. 管理订阅列表与定时抓取
把用户订阅的 URL 存在本地(如 JSON 文件或 SQLite),每次启动时加载。用 time.Ticker 实现后台轮询(例如每 30 分钟检查一次):
- 对每个源发起 HTTP GET 请求(记得设超时,如 10 秒)
- 用 gofeed 解析响应体(注意 Content-Type 和字符编码,gofeed 默认支持 UTF-8 和常见 BOM)
- 比对最新条目的 item.GUID 或 item.Link,避免重复入库
- 只保存未读、且发布时间在最近 7 天内的条目(可配置)
3. 本地存储与去重逻辑
初学者可用 JSON 文件存所有文章(结构清晰、调试方便);进阶推荐 SQLite(支持索引、查询快、单文件便携)。关键字段建议包括:
- id(自增或 UUID)
- title, link, content(HTML 或纯文本)
- published_at(time.Time → SQLite TEXT 或 INTEGER)
- feed_url(来源标识,用于分类筛选)
- read(布尔,默认 false)
去重靠 feed_url + link 联合唯一约束,插入前先 SELECT 判断是否存在。
4. 命令行或简易 Web 展示
命令行版用 spf13/cobra 做 CLI,支持:rss add https://...、rss list --unread、rss read 123。输出用 mattn/go-colorable 加颜色区分状态。
Web 版用 net/http + 模板即可:
-
GET /:渲染未读条目列表(按时间倒序) -
GET /item/:id:渲染单篇文章(自动标记为已读) -
POST /refresh:手动触发一次全量抓取(加简单 auth 如 token 头)
前端模板用 Go html/template,嵌入基础 CSS(如 Bulma 的 CDN),无需 JS 也能有良好阅读体验。










