我正在写一项服务来学习Go。我的主要功能可以在下面找到。它首先读取XML文件并将其存储在切片中。我有一个/rss
端点,它从存储在"数据库"中的项目输出RSS提要。这工作正常。我还有一个端点(/add/{base64}
),用于向该切片添加新项目。不幸的是,我不知道该怎么做。出于某种原因,我需要返回带有添加记录的新database
,以便/rss
可以使用它。但是如何?
我的具体问题是:
database
但我不知道如何返回完整(包括添加的)数据库,以便/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)
}
还是有其他解决方案可以完成这项工作吗?我只想通过所有包提供database
。
答案 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是一个更强大的解决方案,严肃的企业软件可能需要更多的东西(如果你的应用你的模型不起作用)负载平衡或类似的东西)。