将元素添加到 handlerfunc 中的切片和 return 作为一个整体

Adding element to slice in handlerfunc and return as a whole

我正在编写一个服务来学习 Go。我的主要功能可以在下面找到。它首先读取一个 XML 文件并将它们存储在一个切片中。我有一个 /rss 端点,它从 "database" 中存储的项目输出 RSS 提要。这工作正常。我还有一个端点 (/add/{base64}),用于向该切片添加新项目。不幸的是我不知道该怎么做。出于某种原因,我需要 return 带有添加记录的新 database,以便 /rss 可以使用它。但是怎么办?

我的具体问题是:

  1. 我知道如何添加记录到 database
  2. 但我不知道如何 return 完整(包括添加的)数据库,以便 /rss 端点能够使用它。所以我想让 rest.AddArticle return 新数据库,以便 /rss 端点知道添加的项目。

    func main() {
    defer glog.Flush()
    
    // read database
    database := model.ReadFileIntoSlice()
    
    // initialise mux router
    r := mux.NewRouter()
    
    // http handles
    r.HandleFunc("/add/{base64url}", rest.AddArticle(database))
    r.HandleFunc("/rss", rest.GenerateRSS(database))
    
    // start server
    http.Handle("/", r)
    glog.Infof("running on port %d", *port)
    http.ListenAndServe(":"+strconv.Itoa(*port), nil)
    }
    

或者是否有其他解决方案可以完成这项工作?我只希望 database 通过所有软件包可用。

据我所知,问题是您正在写入您的数据库,但您正在从缓存版本中读取,因此 rss 的响应并没有反映发出请求时的模型。如果您查看此代码;

database := model.ReadFileIntoSlice()

// initialise mux router
r := mux.NewRouter()

// http handles
r.HandleFunc("/add/{base64url}", rest.AddArticle(database))

您不知何故需要修改 database 的值。有很多方法可以做到这一点。一些选项是 1) 在某个对象或包级别定义它,然后从定义 AddArticle 的任何地方直接修改它。 2) 刷新你的内存版本,即在你 return 结果之前,再次从数据库读取,这样你就可以确保拥有最新的(obv 性能影响) 3) 不要通过 database值,使参数成为一个指针。 AddArticle 正在获取 database 的副本,而不是您在 rss 调用中阅读的版本的地址。您可以改为将指针传递给该方法,以便修改原始副本(随着模型变大,它的性能也会大大提高)。

基于你的程序的简单性,我可能会做 3。实际上,2 是一个更强大的解决方案,严肃的企业软件可能需要更多类似的东西(如果你的应用程序加载,你的模型就不起作用平衡或类似的东西)。