Go 中如何正确输出 HTTP 响应的文本内容

go 的 ioutil.readall() 返回字节切片([]byte),直接打印会显示 ascii 数值序列;需显式转换为 string 类型才能输出可读文本。

在 Go 中进行 HTTP 请求时,http.Get() 返回的响应体(resp.Body)是一个 io.ReadCloser 接口,需通过 ioutil.ReadAll()(Go 1.16+ 推荐改用 io.ReadAll())读取全部数据。但关键点在于:ioutil.ReadAll() 返回的是 []byte(字节切片),而非字符串。Go 不会自动将字节切片隐式转为字符串——因此直接 fmt.Print(body) 实际打印的是每个字节的十进制 ASCII/UTF-8 编码值(如 [239 187 191 ...]),这正是你看到乱码数字序列的原因。

✅ 正确做法是使用类型转换 string(body) 将字节切片转为 UTF-8 字符串:

package main

import (
    "fmt"
    "io"
    "net/http"
)

func main() {
    resp, err := http.Get("http://test.com/")
    if err != nil {
  

fmt.Printf("HTTP 请求失败: %v\n", err) return } defer resp.Body.Close() // 注意:务必在 error 检查后调用,避免 panic body, err := io.ReadAll(resp.Body) // Go 1.16+ 推荐替代 ioutil.ReadAll if err != nil { fmt.Printf("读取响应体失败: %v\n", err) return } fmt.Print(string(body)) // ✅ 关键:显式转换为字符串 }

⚠️ 注意事项:

  • 始终检查错误:ioutil.ReadAll / io.ReadAll 可能返回非 nil 错误(如网络中断、IO 超时),忽略会导致程序行为异常;
  • defer resp.Body.Close() 应在 err 检查之后,否则当 http.Get 失败时 resp 为 nil,调用 Close() 会 panic;
  • 字符编码兼容性:string(body) 假设字节流为 UTF-8 编码。若服务端返回 GBK、ISO-8859-1 等编码,需借助 golang.org/x/text/encoding 包显式解码;
  • 内存安全:io.ReadAll 将整个响应体加载到内存,对大文件(如图片、视频)应改用流式处理(如 io.Copy 到文件或 bufio.Scanner)。

? 小技巧:可通过 fmt.Printf("%q", body) 快速查看是否含不可见字符(如 BOM);开头的 [239 187 191] 实际是 UTF-8 BOM(Byte Order Mark),多数现代浏览器/解析器可忽略,但某些场景下建议用 bytes.TrimPrefix(body, []byte{0xEF, 0xBB, 0xBF}) 清理。

掌握 []byte 与 string 的显式转换,是 Go 网络编程与 I/O 处理的基础能力。