我是 GoLang 的新手,想在 go-lang 中定义一个全局计数器来记录对 http 服务器进行的查询次数。我认为最简单的方法是定义一个存储当前计数的“全局”变量,并在每个查询中增加它(为了方便起见,让我们把并发问题放在一边)。无论如何,这是我迄今为止计划实现的代码:package mainimport ( "fmt" "net/http")count := 0 // *Error* non-declaration statement outside function bodyfunc increment() error{ count = count + 1 return nil}func mainHandler(w http.ResponseWriter, r *http.Request){ increment() fmt.Fprint(w,count)}func main(){ http.HandleFunc("/", mainHandler) http.ListenAndServe(":8085",nil)}如您所见,count无法在那里定义var ,它与我以前使用的 Java servlet 不同。那么我怎样才能做到这一点呢?
3 回答
FFIVE
TA贡献1797条经验 获得超6个赞
计数器必须以原子方式递增,否则您将遇到竞争条件并错过一些计数。
声明一个全局int64变量并使用以下sync.atomic方法访问它:
package main
import (
"net/http"
"sync/atomic"
)
var requests int64 = 0
// increments the number of requests and returns the new value
func incRequests() int64 {
return atomic.AddInt64(&requests, 1)
}
// returns the current value
func getRequests() int64 {
return atomic.LoadInt64(&requests)
}
func handler(w http.ResponseWriter, r *http.Request) {
incRequests()
// handle the request here ...
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
- 3 回答
- 0 关注
- 271 浏览
添加回答
举报
0/150
提交
取消