《Go程序设计语言》server2示例代码运行异常,是否存在错误?
《Go程序设计语言》server2示例异常问题排查
问题现象
按照书中server2示例实现代码后,出现两个不符合预期的行为:
- 刷新
/count页面时,count值会增长 - 刷新
/或/count页面时,count的增长次数与页面刷新次数不一致
预期行为是仅访问/页面时count才增长,且增长次数与刷新次数完全对应。
原因分析
/count页面触发count增长的原因:
Go的http.HandleFunc采用前缀匹配规则,注册的"/"handler会匹配所有未被更精确路径匹配的请求。浏览器加载任何页面时,都会自动发送/favicon.ico请求获取网站图标,该请求会被"/"的handler捕获,导致count被意外递增——哪怕访问的是/count,浏览器的favicon请求也会触发一次count增长。增长次数与刷新次数不一致的原因:
每次页面刷新,浏览器实际发送两次请求:一次是目标页面(/或/count),另一次是/favicon.ico。访问/时,两次请求都会触发count增长;访问/count时,favicon请求会触发count增长,最终导致count增长次数和页面刷新次数不匹配。
解决方案
修改handler函数,仅当请求路径**精确等于"/"**时才递增count,过滤掉/favicon.ico这类额外请求:
func handler(w http.ResponseWriter, r *http.Request) { // 仅精确匹配根路径时才计数 if r.URL.Path != "/" { http.NotFound(w, r) return } mu.Lock() count++ mu.Unlock() fmt.Fprintf(w, "URL Path = %q\n", r.URL.Path) }
修改后,只有直接访问http://localhost:8000/时count才会增长,访问/count或浏览器自动请求/favicon.ico都不会触发计数,完全符合预期行为。
内容的提问来源于stack exchange,提问作者Sandeep Acharya
相关产品推荐
相关产品推荐

