go 语言通过首字母大小写严格控制标识符的可见性,小写字母开头的函数(如 `doublespace`)属于包内私有,无法从外部包直接调用。
在 Go 中,只有首字母大写的标识符才是导出的(exported),才能被其他包访问。blackfriday 包中定义的 doubleSpace 函数以小写 d 开头,因此是包级私有函数,其作用域仅限于 blackfriday 包内部(如 html.go 文件中)。无论你尝试 blackfriday.doubleSpace 还是 blackfriday.DoubleSpace,编译器都会报错 undefined —— 因为它根本不在导出符号表中。
这并非限制,而是 Go 的核心设计原则:封装性优先,避免外部依赖内部实现细节。正如 Go 官方规范所述:Exported identifiers 明确规定,只有以 Unicode 大写字母开头的标识符才可被导出。
✅ 正确做法是:在你的 main 包(或自定义渲染器所在包)中重新实现该逻辑。由于 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 中尊重包的导出边界,是写出可维护、可升级代码的关键习惯。