猿问

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

我正在编写一个服务来学习 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通过所有软件包提供。


不负相思意
浏览 168回答 1
1回答

HUWWW

据我所知,问题是您正在写入数据库,但您正在从缓存版本中读取数据,因此 rss 的响应并未反映发出请求时的模型。如果你看看这段代码;database := model.ReadFileIntoSlice()// initialise mux routerr := mux.NewRouter()// http handlesr.HandleFunc("/add/{base64url}", rest.AddArticle(database))您需要以某种方式修改database. 有很多方法可以做到这一点。一些选项是 1) 在某个对象或包级别定义它,然后从AddArticle定义的任何地方直接修改它。2)刷新您的内存版本,即在返回结果之前,再次从数据库中读取,这样您就可以确保获得最新的(obv 性能影响) 3)不要database按值传递,而是将参数设为指针。AddArticle正在获取database您在 rss 调用中读取的版本的副本而不是地址。您可以改为将指针传递给该方法,以便修改原始副本(随着模型变大,它的性能也会大大提高)。基于你的程序的简单性,我可能会做 3。实际上 2 是一个更强大的解决方案,严肃的企业软件可能需要更多类似的东西(如果你的应用程序负载平衡或类似的东西,你的模型不起作用)。
随时随地看视频慕课网APP

相关分类

Go
我要回答