将db变量传递给函数参数

时间:2014-01-07 06:37:53

标签: go

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

我的流程是

  1. 从我的Postgres数据库获取供稿
  2. 对于每个Feed,请获取文章
  3. 将每篇文章存储到Postgres数据库
  4. 我的代码如下

    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变量来插入,但这看起来很浪费。

    有没有更好的方法来完成这个过程?

1 个答案:

答案 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 ...无论如何,itemHandlerdb定义{{1}}并且可以访问。

This tutorialthis part of the specs更详细地解释了它