go - 将 db 变量传递给函数参数

标签 go

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

我的流程是

  1. 从我的 Postgres 数据库获取源
  2. 对于每个 Feed,获取文章
  3. 将每篇文章存储到 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 tutorialthis part of the specs更详细地解释一下

关于go - 将 db 变量传递给函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20965401/

相关文章:

go - 如何使用 go 访问和修改备用数据流 (ADS)

github - "go get"之后的 GO 命令行问题

javascript - 从 HTML 调用 Golang

file - 如何在不使用 shell 命令的情况下通过 SSH 以编程方式修改文件?

go - 如何在 Go 中编写接受 string 和 int64 类型的函数?

go - GORM:通用运算符

go - 尝试提供 Gin Gonic 应用程序时出现紧急错误

go - 解码到结构时从 JSON 转换值

date - 如何使用不带数字偏移量的默认区域格式化日期

linux - 有的可执行文件在docker中运行后显示 "no such file or directory",有的则不然