我正在编写一个服务来学习 Go。我的主要功能可以在下面找到。它首先读取一个 XML 文件并将它们存储在一个切片中。我有一个/rss端点,它从存储在“数据库”中的项目输出 RSS 提要。这工作正常。我还有一个端点 ( /add/{base64}) 用于向该切片添加新项目。不幸的是,我不知道如何做到这一点。出于某种原因,我需要database用添加的记录返回新的,这样它就可以用于/rss. 但是如何?我的具体问题是:我知道如何添加记录 database但我不知道如何返回完整的(包括添加的)数据库,以便/rss端点能够使用它。所以我想让rest.AddArticle返回新数据库,以便/rss端点知道添加的项目。func main() {defer glog.Flush()// read databasedatabase := model.ReadFileIntoSlice()// initialise mux routerr := mux.NewRouter()// http handlesr.HandleFunc("/add/{base64url}", rest.AddArticle(database))r.HandleFunc("/rss", rest.GenerateRSS(database))// start serverhttp.Handle("/", r)glog.Infof("running on port %d", *port)http.ListenAndServe(":"+strconv.Itoa(*port), nil)}或者是否有其他解决方案可以完成这项工作?我只想database通过所有软件包提供。
1 回答
HUWWW
TA贡献1874条经验 获得超12个赞
据我所知,问题是您正在写入数据库,但您正在从缓存版本中读取数据,因此 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按值传递,而是将参数设为指针。AddArticle正在获取database您在 rss 调用中读取的版本的副本而不是地址。您可以改为将指针传递给该方法,以便修改原始副本(随着模型变大,它的性能也会大大提高)。
基于你的程序的简单性,我可能会做 3。实际上 2 是一个更强大的解决方案,严肃的企业软件可能需要更多类似的东西(如果你的应用程序负载平衡或类似的东西,你的模型不起作用)。
- 1 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消