在handlerfunc中将元素添加到切片并作为整体返回

时间:2015-05-04 18:39:01

标签: go slice

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

我的具体问题是:

  1. 我知道如何将记录添加到database
  2. 但我不知道如何返回完整(包括添加的)数据库,以便/rss端点能够使用它。所以我想让rest.AddArticle返回新数据库,以便/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)
    }
    
  3. 还是有其他解决方案可以完成这项工作吗?我只想通过所有包提供database

1 个答案:

答案 0 :(得分:1)

据我所知,问题在于您是否正在写入数据库,但是您正在从缓存版本中读取数据,因此rss的响应仅仅反映了模型的时间。提出要求。如果你看一下这段代码;

database := model.ReadFileIntoSlice()

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

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

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

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