fmt.print不换行、不加空格;fmt.println自动加空格和换行;fmt.printf支持格式化、不自动换行或加空格,需手动控制。

fmt 包输出不换行或格式错乱?先看三个函数的边界行为
很多人写 fmt.Print() 后没反应,其实是它不自动换行;而 fmt.Println() 会在每个参数间加空格、末尾加换行,容易在拼接字符串时多出空格。真正需要精确控制时,必须用 fmt.Printf()。
-
fmt.Print("a", "b")→ 输出ab(无分隔、无换行) -
fmt.Println("a", "b")→ 输出a b\n(空格分隔 + 换行) -
fmt.Printf("%s:%d", "count", 42)→ 输出count:42(无额外字符)
调试时别混用:日志打点建议统一用 fmt.Printf() 配合 %+v 查结构体字段,避免 fmt.Println() 把指针地址和值一起糊成一团。
net/http 启动服务后访问 404?检查路由注册顺序和 handler 类型
http.HandleFunc() 只接受 func(http.ResponseWriter, *http.Request),但如果你传了带返回值的函数,或漏写了参数类型,Go 编译器不会报错——它会静默忽略注册,导致所有路径都 fallback 到默认 404。
- 错误写法:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) error { ... })(多了error返回) - 正确写法:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { ... }) - 路由注册必须在
http.ListenAndServe()之前,且不能有 panic 未捕获,否则服务根本起不来
本地测试时,用 curl -v http://localhost:8080/ 看响应头,如果返回 HTTP/1.1 404 Not Found 且没进 handler,八成是注册失败或路径不匹配。
os.ReadFile 读文件报 “no such file or directory”?路径不是相对 main.go 的
os.ReadFile() 的路径是相对于**当前工作目录**(即你执行 go run 或 ./xxx 时所在的目录),不是相对于源文件位置。这是最常踩的坑。
- 项目结构为
./main.go和./config.json,你在终端里 cd 到./cmd/app下运行go run ../main.go,那os.ReadFile("config.json")就会去./cmd/app/config.json找 - 安全做法:用
os.Executable()获取二进制路径,再用filepath.Dir()拼配置路径,或直接把资源 embed 进二进制(//go:embed config.json) - 开发期可加一行
fmt.Println("cwd:", os.Getwd())快速确认当前路径
time.Now().Format() 输出时间总少 8 小时?时区没显式指定
time.Now() 默认返回本地时区时间,但 .Format() 使用的是 UTC 时间布局("2006-01-02 15:04:05" 是 Go 的固定参考时间,本身是 UTC)。如果你本地是 CST(UTC+8),又没调 In(),就会显示比实际晚 8 小时。
- 错误写法:
time.Now().Format("2006-01-02 15:04:05")(结果是 UTC 时间) - 正确写法:
time.Now().In(time.Local).Format("2006-01-02 15:04:05") - 更稳妥:用
time.LoadLocation("Asia/Shanghai")显式加载时区,避免依赖系统设置
线上部署时,容器默认时区常为 UTC,time.Local 可能为空,所以硬编码时区名比依赖 time.Local 更可靠。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











