当前位置: 首页 > 知识库问答 >
问题:

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

雷锋
2025-12-31

下面用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

共有1个答案

濮阳振
2025-12-31

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

原因分析:

  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 服务器的错误。

 类似资料:
  • 问题内容: 我有以下课程: 这是编译结果; 为什么我的输出中包含数字? 问题答案: 在第二种情况下,它将两个字符(G-71和o-111)的unicode码相加并打印总和。这是因为被视为数字类型,因此在这种情况下,运算符是通常的求和。

  • 问题内容: path = “/Volumes/Users” >>> path.lstrip(‘/Volume’) ‘s/Users’ >>> path.lstrip(‘/Volumes’) ‘Users’ >>> 我期望的输出是 问题答案: 是基于字符的,它将删除该字符串中左端的所有字符。 要验证这一点,请尝试以下操作: 由于是字符串的一部分,因此将其删除。 您需要改用切片: 或者,在Python

  • 我试图通过三个线程打印三个AP序列(增量为3),如下所示: 线程-1正在打印序列 线程2正在打印序列 线程-3正在打印序列 当任何其他线程轮流打印其序列的数字时,线程应该等待。线程应该相互合作,从1到LIMIT(一个整数;这里LIMIT=10)依次打印数字。 (对于极限 = 10) (对于极限 = 10) 该程序有三种不同的同步方法:、、,分别由Thread-1、Thread-2和Thread-3

  • gohttp 是一个 http 的文件服务器。因为是用 go 语言写的,所以加了一个 go 的抬头。之所以用 go 是因为发布起来是一个二进制文件,不同的平台都可以用,而且没有依赖问题,且稳定性也很好。 pjax简称页面ajax技术 在gohttp进行目录却换的时候,你会看到地址栏在变,但是页面却是局部刷新的。 各种文件的预览功能 所有常见的代码都可以直接在gohttp下预览,如果你用的是chro

  • 可以通过在您的产品中集成各种服务、增效工具和扩展功能来增强您的产品。您还可以下载示例和其它资源以帮助您完成工作。 Adobe Creative 在线服务 Adobe® Creative Suite® 4 包含新的在线功能,能够为您提供强大的桌面 Web 功能。使用这些功能可以联系社区、进行协作及获取更多 Adobe 工具。功能强大的 Creative 在线服务使您可以完成从颜色匹配到数据会议的各种

  • 问题内容: 当我调试该程序时,服务数组为空? 问题答案: 这是因为没有找到与指定的DocFlavor和属性集相对应的PrintService 。除非您的打印机硬件是最新的,否则可能很难找到支持PostScript的打印机。您可以像这样检查所有支持的DocFlavor: 要查找特定的打印服务,您可以执行以下操作:

  • 我目前完成的工作: 设置一个带有杯子的树莓圆周率,插入Dymo Labelwriter 450 点击以下链接:设置树莓圆周率。如果我通过家庭网络上的Windows安装网络打印机,这可以在我的本地计算机(Windows)上正常工作并打印 已从成功打印打印作业。NET内核通过。这主要是为了测试。这是当USB标签打印机直接插入我的机器 有一个。从docker容器运行的NET Core(3.1)Web A

  • 问题内容: 我是负责重新设计软件系统的java / grails开发人员。 要求之一是让服务器端应用程序将数据发送到各种网络打印机以打印文本数据。 我在网上搜索了有关Java网络打印的信息,然后简短地了解了Java Print Service API,java.awt.print,javax.print,但在连接到网络打印机时未找到任何信息。 是我想做的可能或有利的事情。缺乏发现使我相信服务器端软