为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
不负相思意 2021-10-04 16:02:19
我正在编写一个服务来学习 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 是一个更强大的解决方案,严肃的企业软件可能需要更多类似的东西(如果你的应用程序负载平衡或类似的东西,你的模型不起作用)。


查看完整回答
反对 回复 2021-10-04
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信