go 语言通过首字母大小写严格控制标识符的可见性:仅首字母大写的标识符才能被其他包访问;小写开头的函数、变量或类型属于包内私有,外部包无法直接调用——这是语言层面的强制封装机制,而非约定。
在 Go 中,blackfriday.doubleSpace 或 blackfriday.DoubleSpace 均无法编译通过,根本原因在于 doubleSpace 是一个未导出(unexported)标识符:其名称以小写字母 d 开头,因此仅在 blackfriday 包内部可见。Go 编译器会直接报错 undefined: blackfriday.doubleSpace,这并非路径或导入问题,而是语言规范的硬性约束(参见 Go 语言规范:导出标识符)。
✅ 正确做法是:在你的 main 包(或自定义 renderer 所在包)中重新实现该逻辑。由于 doubleSpace 功能简单明确,可安全复现:
func doubleSpace(out *bytes.Buffer) { if out.Len() > 0 { out.WriteByte('\n') } } func (r *renderer) Paragraph(out *bytes.Buffer, text func() bool) { marker := out.Len() doubleSpace(out) // 使用本地定义的版本 out.WriteString("
") if !text() { out.Truncate(marker) return } out.WriteString("
\n") }
⚠️ 注意事项:
总之,Go 的私有性是编译期保障的封装边界,尊重它意味着写出更健壮、可维护的模块化代码。