根据你的代码和现象,问题出在浏览器会发送两个请求,导致处理函数执行了两次:
原因分析:
第一个请求(路径 /):
- 浏览器请求
http://localhost/,路径为 r.URL.Path = "/" fmt.Fprintf(w, "%s", "/") 写入 1个字节(字符 / 的ASCII码占1字节)fmt.Println(num) 输出 1
第二个请求(路径 /favicon.ico):
- 浏览器自动请求 favicon 图标(地址为
http://localhost/favicon.ico) - 路径
r.URL.Path = "/favicon.ico" fmt.Fprintf(w, "%s", "/favicon.ico") 写入 12个字节(字符串长度)fmt.Println(num) 输出 12
验证方法:
在代码中添加路径打印:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
num, _ := fmt.Fprintf(w, "%s", path)
fmt.Printf("Path: '%s' → Bytes: %d\n", path, num) // 打印路径和字节数
})
输出结果会变为:
Path: '/' → Bytes: 1
Path: '/favicon.ico' → Bytes: 12
解决方案:
如果不需要处理 favicon 请求,可添加单独的路由处理:
http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNoContent) // 返回 204 空响应
})
总结:
多出的 12 是因为浏览器自动请求 /favicon.ico,该路径字符串长度为 12 字符(含斜杠),通过 fmt.Fprintf 写入响应时返回的字节数。这是浏览器的正常行为,并非 Go 服务器的错误。