将 db 变量传递给函数参数

  • 本文关键字:函数 参数 db 变量 go
  • 更新时间 :
  • 英文 :


我正在尝试使用Golang解析一些RSS提要。我找到的一个包裹 https://github.com/jteeuwen/go-pkg-rss

我的流程是

  1. 从我的邮政数据库获取提要
  2. 对于每个源,获取文章
  3. 将每篇文章存储到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

本教程和规范的这一部分更详细地解释了它

最新更新