我正在尝试使用Golang解析一些RSS提要。我找到的一个包裹 https://github.com/jteeuwen/go-pkg-rss
我的流程是
- 从我的邮政数据库获取提要
- 对于每个源,获取文章
- 将每篇文章存储到Postgres DB中
我的代码如下
func main() {
db := dbConnect() // returns the DB connection variable
feeds := getRssFeeds(db) // returns feeds from my DB
for i := 0; i < len(feeds); i++ {
getFeedArticles(feeds[i].url, 5, db)
}
}
func getFeedArticles(uri string, timeout int, db *sql.DB) {
// using the package to get RSS feed contents
feed := rss.New(timeout, true, chanHandler, itemHandler)
if err := feed.Fetch(uri, nil); err != nil {
fmt.Fprintf(os.Stderr, "[e] %s: %s", uri, err)
return
}
}
func chanHandler(feed *rss.Feed, newchannels []*rss.Channel) {
// no need to do anything...
}
func itemHandler(feed *rss.Feed, ch *rss.Channel, newitems []*rss.Item) {
for i := 0; i < len(newitems); i++ {
fmt.Println(newitems[i].Title)
// insert the article into DB here
}
}
如何将 db
变量传递给 itemHandler
以便将文章插入我的数据库?我想我可以调用dbConnect()
来创建一个要插入的新db
变量,但这似乎很浪费。
有没有更好的方法来执行此过程?
您可以使用闭包:
func makeHandler(db Database) rss.ItemHandler {
return func(feed *rss.Feed, ch *rss.Channel, newitems []*rss.Item) {
for i := 0; i < len(newitems); i++ {
fmt.Println(newitems[i].Title)
// Accessed via closure:
db.InsertArticle(newitems[i])
}
}
}
或其某种变体。然后,您可以使用 makeHandler(db)
调用rss.New
,或在 getFeedArticle
中定义itemHandler
...无论如何,itemHandler
都将定义和访问db
。
本教程和规范的这一部分更详细地解释了它