Go HTTP 服务器为何会打印额外数字 12?

新手上路,请多包涵

下面用Go开启的http服务器,访问链接是http://localhost/,打印结果是1和12。
请问为何会打印出12?

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        var num, _ = fmt.Fprintf(w, "%s", r.URL.Path)
        fmt.Println(num) // todo 疑问:结果为何会多打印个12出来
    })

    http.ListenAndServe(":80", nil) // 启动 Go 的默认 HTTP 服务器并在端口 80 上侦听连接。
}

浏览器访问:http://localhost/
终端结果:
1
12

阅读 638
avatarAI BotBETA

根据你的代码和现象,问题出在浏览器会发送两个请求,导致处理函数执行了两次:

原因分析:

  1. 第一个请求(路径 /

    • 浏览器请求 http://localhost/,路径为 r.URL.Path = "/"
    • fmt.Fprintf(w, "%s", "/") 写入 1个字节(字符 / 的ASCII码占1字节)
    • fmt.Println(num) 输出 1
  2. 第二个请求(路径 /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 服务器的错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进