我正在尝试使用Golang解析一些RSS提要。我发现的一个包是https://github.com/jteeuwen/go-pkg-rss
我的流程是
我的代码如下
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
变量来插入,但这看起来很浪费。
有没有更好的方法来完成这个过程?
答案 0 :(得分:3)
您可以使用闭包:
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])
}
}
}
或其一些变化。然后,您可以使用rss.New
致电makeHandler(db)
,或在itemHandler
中定义getFeedArticle
...无论如何,itemHandler
将db
定义{{1}}并且可以访问。
This tutorial和this part of the specs更详细地解释了它