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

golang http服务器如何定义全局计数器

golang http服务器如何定义全局计数器

Go
蛊毒传说 2021-09-10 20:51:19
我是 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 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

在函数之外,您不能使用短变量声明:=。在定义全局变量的函数之外,您必须使用变量声明(使用var关键字):

var count int

它将自动初始化为int的零值,即0


查看完整回答
反对 回复 2021-09-10
?
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))

}


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

添加回答

举报

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