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

我是 GoLang 的新手,想在 go-lang 中定义一个全局计数器来记录对 http 服务器进行的查询次数。


我认为最简单的方法是定义一个存储当前计数的“全局”变量,并在每个查询中增加它(为了方便起见,让我们把并发问题放在一边)。


无论如何,这是我迄今为止计划实现的代码:


package main


import (

    "fmt"

    "net/http"

)


count := 0 // *Error* non-declaration statement outside function body

func 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 不同。


那么我怎样才能做到这一点呢?


蛊毒传说
浏览 272回答 3
3回答

函数式编程

在函数之外,您不能使用短变量声明:=。在定义全局变量的函数之外,您必须使用变量声明(使用var关键字):var count int它将自动初始化为int的零值,即0。

FFIVE

计数器必须以原子方式递增,否则您将遇到竞争条件并错过一些计数。声明一个全局int64变量并使用以下sync.atomic方法访问它:package mainimport (    "net/http"    "sync/atomic")var requests int64 = 0// increments the number of requests and returns the new valuefunc incRequests() int64 {    return atomic.AddInt64(&requests, 1)}// returns the current valuefunc 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))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go