我正在尝试使用 Golang 解析一些 RSS 提要。我找到的一个包是 https://github.com/jteeuwen/go-pkg-rss
我的流程是
- 从我的 Postgres 数据库获取源
- 对于每个 Feed,获取文章
- 将每篇文章存储到 Postgres 数据库
我的代码如下
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
。
This tutorial和 this part of the specs更详细地解释一下
关于go - 将 db 变量传递给函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20965401/