gpt4 book ai didi

http - 如何使用 Go http 包提供共享结构?

转载 作者:IT王子 更新时间:2023-10-29 01:41:22 26 4
gpt4 key购买 nike

我有一个包含许多字段的结构(其中一些字段也是指向其他结构的指针),这些字段在单独的 goroutine 中不断更新。当提供页面时,从 go 的 http 模板访问相同的结构。

代码示例:

type SharedStruct struct {
Description string
Counter int
Status_ *Status
LastChecked time.Time
//other fields
}
var shared = &SharedStruct{}

go func() {
//..updates fields every 5 minutes
}()

go-http 处理程序:

func someHandler(w http.ResponseWriter, r *http.Request) {
t.ExecuteTemplate(w, "page.html", shared)
}

page.html模板:

...
Status: {{.Status_.StatusCode}}
Counter: {{.Counter}}
Last checked: {{.LastChecked.Format "2006-02-01 15:04:05"}}

到目前为止,一切都按预期进行,但我知道如果没有任何同步,可能会发生不好的事情。正确处理此问题的首选方法是什么?

最佳答案

首选方式与任何其他情况相同。

在读取/更新共享结构时使用互斥锁:

var shared = &SharedStruct{}
var mux = &sync.RWMutex{}

func someHandler(w http.ResponseWriter, r *http.Request) {
mux.RLock()
defer mux.RUnlock()
t.ExecuteTemplate(w, "page.html", shared)
}

// Code that modifies shared:
mux.Lock()
shared.Counter++
mux.Unlock()

或者如果模板执行需要很长时间,复制shared结构并在执行模板时传递副本可能是有利的,这样在模板执行期间访问 shared 未被阻止。请注意,在制作副本时,您仍然必须使用互斥锁。此外,如果不仅指针而且指向的值都可能发生变化,您还必须复制它们:

func someHandler(w http.ResponseWriter, r *http.Request) {
mux.RLock()
shared2 := &SharedStruct{}
*shared2 = *shared
shared2.Status_ = new(Status)
*shared2.Status_ = *shared.Status_
mux.RUnlock()

t.ExecuteTemplate(w, "page.html", shared2)
}

如果模板只使用 shared 字段的一小部分,当然只复制这些字段就足够了。

关于http - 如何使用 Go http 包提供共享结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45877980/

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