blackfriday 已归档且不再维护,应改用 goldmark;goldmark 是 Go 社区当前事实标准,支持 CommonMark、可扩展、活跃维护,基础转换仅需三行代码,但需注意扩展启用、HTML 渲染配置及安全选项。

blackfriday 已被弃用,别再用它了
Go 官方生态里 blackfriday 确实曾是主流,但现在它已归档(archived),不再维护,且不支持 CommonMark 0.30+ 标准。你如果现在新建项目还引入 github.com/russross/blackfriday/v2,大概率会遇到解析不一致、安全 issue 不修复、或和 goldmark 生态工具链冲突的问题。
替代方案明确:用 github.com/yuin/goldmark —— 它是当前 Go 社区事实标准,可扩展、合规、活跃维护。
goldmark 基础转换:三行代码搞定
不需要插件、不写配置,纯转 HTML 只需初始化一个 goldmark.Markdown 实例并调用 Convert():
md := goldmark.New()
buf := &bytes.Buffer{}
if err := md.Convert([]byte("# Hello"), buf); err != nil {
log.Fatal(err)
}
fmt.Println(buf.String()) // <h1>Hello</h1>
-
Convert()第一个参数是[]byte,不是string—— 忘记[]byte(input)会编译报错 - 输出写入
io.Writer(比如*bytes.Buffer),不是直接返回字符串 —— 想要string就调buf.String() - 默认不启用表格、脚注、任务列表等扩展语法;要开就得显式加
parser.WithExtensions()
启用 GitHub 风格语法:表格、删除线、自动链接
用户粘贴的 Markdown 往往含 ~~strikethrough~~ 或 | col1 | col2 |,goldmark 默认不认这些。必须手动加载扩展:
立即学习“go语言免费学习笔记(深入)”;
import "github.com/yuin/goldmark/extension" <p>md := goldmark.New( goldmark.WithExtensions( extension.GFM, ), )
-
extension.GFM是最常用组合:包含表格、删除线、自动链接、围栏代码块语言标识 - 别误用
extension.Extended—— 它含脚注、数学公式等冷门功能,体积大且可能引入非预期解析行为 - 如果还要渲染代码块带行号,得额外加
extension.WithCodeFenceOptions(extension.CodeBlockNumerator),不是开 GFM 就自带
自定义渲染 HTML 标签:比如给 code 加 class
默认生成的 <code> 没 class,前端用 Prism.js 或 highlight.js 时无法触发高亮。必须替换 HTML 渲染器:
import (
"github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/extension"
)
<p>md := goldmark.New(
goldmark.WithRendererOptions(
html.WithHardWraps(),
html.WithXHTML(),
html.WithUnsafe(), // 允许 raw HTML(如 <script>),按需开启
),
goldmark.WithExtensions(extension.GFM),
)
-
html.WithUnsafe()默认关闭 —— 这是安全默认值,但如果你允许用户输入可信内容(如内部文档系统),才考虑打开 - 想给
<code>加class="go"?得写自定义renderer.NodeRenderer,不是靠选项开关 - 常见坑:
WithXHTML()会让空标签变成<br/>,而多数现代前端框架(React/Vue)更习惯 HTML5 语义,建议关掉
真正难的不是调通第一行,而是搞清哪些扩展必须配、哪些 class 要手写、哪些 unsafe 行为在你的场景里到底安不安全 —— 这些边界,文档不会替你判断。











