goldmark 是 Go 中唯一靠谱的 Markdown 解析器,因其线程安全、默认防 XSS、完全兼容 CommonMark 且持续维护;但需手动注册扩展(如 extension.GFM)和配置渲染器(如 html.WithUnsafe()),否则表格、任务列表等功能失效。

直接用 goldmark,别自己解析,也别用已归档的 blackfriday。它线程安全、可复用、默认防 XSS,但必须手动开扩展、配渲染器,否则表格、代码块、任务列表全丢。
为什么 goldmark 是唯一靠谱选择
Go 没内置 Markdown 解析器,blackfriday 在 2021 年就归档了,v2 版本不再接收任何修复;gomarkdown/markdown 虽活跃但设计偏老,AST 扩展能力弱;goldmark 是 Hugo 默认引擎,API 清晰、无 CGO、完全兼容 CommonMark,且维护频率高(最近一次 commit 在 2026 年 5 月)。
-
goldmark.New()返回实例是并发安全的,可全局复用——这是高性能前提 - 默认禁用 raw HTML、不渲染表格、不识别
- [x],不是 bug,是安全策略 - 所有扩展(如表格、脚注、代码围栏)都必须显式注册,没“开箱即用”这回事
基础转换三行代码,但漏掉 WithRendererOptions 就白写
常见错误:写了 html.WithUnsafe() 却没包在 goldmark.WithRendererOptions() 里,结果 HTML 标签仍被转义成文本。
- 输入必须是
[]byte,传string得先转:[]byte(src) - 输出必须写入
io.Writer,bytes.Buffer最常用;strings.Builder不行,它没实现Write() - 启用原始 HTML 渲染的完整写法:
goldmark.WithRendererOptions(html.WithUnsafe()) - 若只要部分 HTML(比如只放行
<img>和<span>),得自己写ast.Walk拦截节点,不能靠正则后处理
加表格、代码高亮、任务列表,顺序和依赖不能错
只导入 extension.Table 不等于支持 GFM 表格——它需要配套的 parser 选项才能识别 | a | b | 结构。
使用 markitdown 将文档和文件转换为 Markdown。适用于转换 PDF、Word (.docx)、PowerPoint (.pptx)、Excel (.xlsx, .xls)、HTML、CSV、JSON、XML 等格式。
立即学习“go语言免费学习笔记(深入)”;
- 必须一起注册:
goldmark.WithExtensions(extension.GFM)(推荐)或extension.Table, extension.TaskList, extension.FencedCode - 代码高亮要两步:先加
extension.CodeFence,再配renderer.WithHighlighting(highlighter),其中highlighter是chromav2 实例 -
chromav2 的 import 路径是github.com/alecthomas/chroma/v2,混用 v1 会编译失败 - 中文路径链接(如
)不会自动编码,浏览器加载 404;得在RenderImage方法里对dest字段调用url.PathEscape()
Web 服务中高频调用的性能陷阱
单次渲染慢,往往不是 goldmark 本身问题,而是每次请求都 goldmark.New() + 重复注册扩展。
- 全局初始化一个
*goldmark.Markdown实例,复用它调用Convert() - 禁用不用的扩展:比如不需要数学公式,就别加
extension.MathJax - 大文档(>50KB)建议预渲染缓存,AST 构建占耗时大头,别每次都重解析
- 若需给标题加锚点、外链加
rel="noopener",别 post-process HTML 字符串,用自定义renderer.NodeRenderer注入,更可靠
最易被忽略的是:没开 extension.GFM 却指望任务列表能渲染,或者开了 WithUnsafe() 却没做 AST 层过滤——这两类配置组合,线上一跑就出内容丢失或 XSS 漏洞。


















