首页 >后端开发 >Golang >为什么 My Go Web 服务器的呼叫计数仅显示奇数?

为什么 My Go Web 服务器的呼叫计数仅显示奇数?

Linda Hamilton
Linda Hamilton原创
2024-12-23 04:31:10510浏览

Why Does My Go Web Server's Call Count Show Only Odd Numbers?

为什么 Web 服务器的调用计数会跳过偶数

问题

当使用此 Go Web 服务器来计算其调用次数时,它会打印奇数数字预期序列 1, 2, 3...:

 package mainimport (
  "fmt"
  "net/http"
)

var calls int

// HelloWorld print the times being called.
func HelloWorld(w http.ResponseWriter, r *http.Request){
    calls++
    fmt.Fprintf(w, "You've called me %d times", calls)
}

func main() {
  fmt.Printf("Started server at http://localhost%v.\n", 5000)
  http.HandleFunc("/", HelloWorld)
  http.ListenAndServe(":5000", nil)
}

解决方案

观察到的行为是由于浏览器对 favicon.ico 文件的处理造成的。当加载网页时,浏览器会请求该文件,这是一个标准的网站图标。由于给定代码提供的 Web 服务器不提供有效的 favicon.ico,因此浏览器会重复请求它。

由于每个请求都算作 HelloWorld 处理程序的调用,因此即使用户仅刷新页面一次。 favicon.ico 请求夹在由 HelloWorld 函数处理的根 URL(“/”)调用之间,导致数字序列不均匀。

为了防止这种情况,可以检查 HelloWorld 中的请求路径函数并忽略对 favicon.ico 的请求:

func HelloWorld(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        return
    }
    count := atomic.AddInt64(&calls, 1)
    fmt.Fprintf(w, "You've called me %d times", count)
}

此修改可确保仅针对根 URL 的请求,调用计数才会增加。或者,可以在 Web 服务器配置中完全禁用 favicon.ico 请求。

以上是为什么 My Go Web 服务器的呼叫计数仅显示奇数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn