Go调试首选fmt.Println和fmt.Printf:前者自动换行空格、适合快速查值;后者需格式符(如%v、%+v)、支持精准控制。注意行号标记、避免循环狂打、防止Printf参数错配等坑。

在 Go 语言中调试最常用的方式就是用 fmt 包输出信息,核心是 fmt.Println 和 fmt.Printf ——前者适合快速看值,后者适合格式化输出、定位问题。
fmt.Println:简单直接,自动换行加空格
它把每个参数按默认格式打印,参数间加空格,末尾自动换行。适合临时打日志、查变量值,不用记格式符。
- 多个变量一起打?直接传进去就行:
fmt.Println(a, b, "hello", c) - 结构体、切片、map 都能直接打印,Go 会显示可读的默认表示(比如
{Name:"Tom" Age:25}) - 注意:它不支持格式控制,比如不能指定小数位数或对齐方式
fmt.Printf:精准控制,类似 C 的 printf
需要写格式字符串,用占位符(如 %v、%s、%d)匹配参数,适合构造清晰、带上下文的调试信息。
-
%v:通用打印,推荐日常调试用,结构体、接口、nil 都能安全显示 -
%+v:结构体字段名也打出来,比如{Name:"Tom" Age:25}→{Name:"Tom" Age:25}(更易读) -
%#v:输出 Go 语法风格的字面量,适合复制粘贴回代码里测试 - 常见组合:
fmt.Printf("user=%+v, err=%v\n", user, err)
调试时的小技巧
光会打印还不够,加点小习惯能让调试效率翻倍:
立即学习“go语言免费学习笔记(深入)”;
- 在关键位置加文件名和行号:
fmt.Printf("[%s:%d] value=%v\n", filepath.Base(__FILE__), __LINE__, x)(需导入path/filepath) - 用
log包替代fmt做正式日志(支持时间戳、级别、输出到文件),但调试阶段fmt更轻量 - 避免在循环里狂打
Println,可能拖慢程序或刷屏;可用条件包裹:if debug { fmt.Println(...)}
别踩的坑
几个新手常遇到的问题:
- 忘记换行:用
Printf时不加\n,输出会卡在缓冲区或跟下一行挤在一起 - 参数数量/类型不匹配:
Printf("%d %s", "abc", 123)会 panic,顺序和类型必须严格对应 - 打印指针地址误以为是值:
%p打的是内存地址,想看内容用%v或%+v
基本上就这些。Println 快速上手,Printf 精准表达,搭配着用,调试不费劲。











