
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 处理的基础能力。










