print 和 println 是 Go 编译器预声明的内置函数,非 fmt 包成员,仅用于 init 或 runtime 引导阶段;它们无格式化能力、不返回值、不可重定向、输出行为不确定,实际项目中应避免使用。

print 和 println 是内置函数,不是 fmt 包的
它们不属于 fmt 包,无需 import,也不能用 fmt.print 调用。Go 编译器在启动早期就预声明了这两个函数,主要用在 init 阶段或 runtime 引导时——那时 fmt 还没初始化。实际项目里几乎不该用它们,因为行为不保证、无格式化、输出目标不确定(规范只说“写入标准错误”,但不同构建环境可能指向不同地方)。
print 不换行,println 自动加空格和换行
两者都按默认格式打印所有参数,但拼接方式不同:
-
print("a", 1, true)→ 输出a1true(紧挨着,无分隔,无换行) -
println("a", 1, true)→ 输出a 1 true\n(参数间加空格,末尾强制换行)
注意:空格是硬编码插入的,哪怕某个参数是空字符串 "",println("", "b") 也会输出 b\n(开头多一个空格),这在生成协议文本(如 HTTP header)时会直接出错。
print/println 不能格式化,且对复杂类型输出不可靠
它们没有格式动词,也不支持 %v 或 %+v。打印 struct、map、slice 时,结果取决于 Go 版本和编译器优化:
立即学习“go语言免费学习笔记(深入)”;
m := map[string]int{"x": 1}-
println(m)可能输出map[0xc0000b4000](地址)或map[x:1](内容),无法预测 - 未导出字段(小写开头)永远不显示,连
%+v都做不到
调试时看到一堆地址,别怀疑代码,是函数本身能力边界。
print/println 没有返回值,也无法重定向
fmt.Print 系列返回 (n int, err error),至少能感知写失败;而 print 和 println 完全不返回任何东西,写失败也静默吞掉。更关键的是,它们只能写到 stderr,且无法替换目标 —— 想把输出捕获进 bytes.Buffer 或写入文件?办不到。测试中想断言日志内容?必须换 fmt.Fprint + bytes.Buffer。
真正容易被忽略的点是:它们不是“轻量版 fmt”,而是“引导期临时补丁”。一旦 fmt 可用,就该立刻停用。



















