当使用此 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中文网其他相关文章!