You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Go程序设计语言》server2示例代码运行异常,是否存在错误?

《Go程序设计语言》server2示例异常问题排查

问题现象

按照书中server2示例实现代码后,出现两个不符合预期的行为:

  • 刷新/count页面时,count值会增长
  • 刷新/或/count页面时,count的增长次数与页面刷新次数不一致

预期行为是仅访问/页面时count才增长,且增长次数与刷新次数完全对应。

原因分析

  1. /count页面触发count增长的原因:
    Go的http.HandleFunc采用前缀匹配规则,注册的"/" handler会匹配所有未被更精确路径匹配的请求。浏览器加载任何页面时,都会自动发送/favicon.ico请求获取网站图标,该请求会被"/"的handler捕获,导致count被意外递增——哪怕访问的是/count,浏览器的favicon请求也会触发一次count增长。

  2. 增长次数与刷新次数不一致的原因:
    每次页面刷新,浏览器实际发送两次请求:一次是目标页面(/或/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:42:49