gpt4 book ai didi

http - 如何在 Golang 中存储或缓存要在 http 请求中提供的值?

转载 作者:IT老高 更新时间:2023-10-28 13:06:24 27 4
gpt4 key购买 nike

我正在编写一些 Go 网络服务(也在 Go 中使用 http.ListenAndServe 实现网络服务器)。我有一个结构图,我想将其保存在内存中(数据大小约为 100Kb),以供不同的 HTTP 请求使用。

如何在 Go 中实现这一点?我正在考虑使用全局包变量或缓存系统(如 memcache/groupcache)。

最佳答案

除了你已经收到的答案,考虑使用receiver-curried method valueshttp.HandlerFunc .

如果您的数据是在流程开始之前加载的数据,您可以使用以下内容:

type Common struct {
Data map[string]*Data
}

func NewCommon() (*Common, error) {
// load data
return c, err
}

func (c *Common) Root(w http.ResponseWriter, r *http.Request) {
// handler
}

func (c *Common) Page(w http.ResponseWriter, r *http.Request) {
// handler
}

func main() {
common, err := NewCommon()
if err != nil { ... }

http.HandleFunc("/", common.Root)
http.HandleFunc("/page", common.Page)

http.ListenAndServe(...)
}

如果所有的 Common 数据都是只读的,这会很好地工作。如果 Common 数据是读/写的,那么你会想要更多类似的东西:

type Common struct {
lock sync.RWMutex
data map[string]Data // Data should probably not have any reference fields
}

func (c *Common) Get(key string) (*Data, bool) {
c.lock.RLock()
defer c.lock.RUnlock()
d, ok := c.data[key]
return &d, ok
}

func (c *Common) Set(key string, d *Data) {
c.lock.Lock()
defer c.lock.Unlock()
c.data[key] = *d
}

其余部分基本相同,只是不是直接通过接收者的字段访问数据,而是通过 getter 和 setter 访问它们。在读取大部分数据的网络服务器中,您可能需要一个 RWMutex,以便可以同时执行读取操作。第二种方法的另一个优点是您已经封装了数据,因此如果您的应用程序有这样的需求,您可以在未来添加对 memcache 或 groupcache 或类似性质的透明写入和/或读取。

我非常喜欢将我的处理程序定义为对象上的方法的一点是,它使对它们进行单元测试变得更加容易:您可以轻松定义 table driven test这包括您想要的值和您期望的输出,而无需使用全局变量。

关于http - 如何在 Golang 中存储或缓存要在 http 请求中提供的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18487923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com