在 Go 中使用 Markdown:blackfriday、goldmark 和 chroma 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Go (Golang) 中使用 Markdown:流行库概述



Go (Golang) 是一种现代编译型语言,常用于创建高性能 Web 应用程序、CLI 工具和静态网站生成器。其中一个典型任务是处理 Markdown 标记。在本文中,我们将介绍三个关键库:blackfriday、goldmark 和 chroma,并展示如何将它们结合起来,创建一个功能完整的 Markdown 转 HTML(带语法高亮)转换器。



1. 为什么要在 Go 中处理 Markdown?

Markdown 是一种轻量级标记语言,广泛用于文档、博客、README 文件和内容管理系统。在 Go 生态系统中,有几个成熟的库可以实现:

  • 将 Markdown 转换为 HTML 以用于 Web 发布。
  • 为代码块添加语法高亮。
  • 创建自定义扩展(例如,支持 LaTeX、图表或自定义块)。
  • 集成到静态网站生成器中(Hugo、自定义解决方案)。


2. blackfriday 库 (v2)

Blackfriday 是 Go 中最古老、最流行的库之一。它运行速度快,行为接近 CommonMark 标准。安装:

go get github.com/russross/blackfriday/v2


简单使用示例:

package main

import ( "fmt" "github.com/russross/blackfriday/v2")

func main() { input := []byte("## 你好,Markdown!

这是**粗体文本**和`代码`。") output := blackfriday.Run(input) fmt.Println(string(output))}


结果是一个包含 h2 标题、段落以及 strong/code 标签的 HTML 代码。Blackfriday 支持扩展:表格、删除线、任务列表和自动链接。激活方式:

html := blackfriday.Run(input,    blackfriday.WithNoExtensions(),    blackfriday.WithExtensions(blackfriday.CommonExtensions),)


3. goldmark 库(推荐)

Goldmark 是一个用纯 Go 编写的现代 Markdown 解析器。它完全符合 CommonMark 0.30 规范,并提供灵活的 API 用于扩展。安装:

go get github.com/yuin/goldmark


基本示例:

package main

import ( "bytes" "fmt" "github.com/yuin/goldmark")

func main() { source := []byte("# 标题

包含**粗体**和*斜体*的普通文本。") var buf bytes.Buffer if err := goldmark.Convert(source, &buf); err != nil { panic(err) } fmt.Println(buf.String())}


Goldmark 易于扩展。内置扩展包括表格、任务列表、脚注、自动链接以及通过 chroma 实现的代码高亮。带表格扩展的示例:

import (    "github.com/yuin/goldmark"    "github.com/yuin/goldmark/extension")

markdown := goldmark.New( goldmark.WithExtensions(extension.Table),)


4. 使用 chroma 进行代码高亮

Chroma 是一个 Go 语法高亮库,支持超过 190 种编程语言和多种主题。安装:

go get github.com/alecthomas/chroma/v2


与 goldmark 的集成如下:

package main

import ( "bytes" "fmt" "github.com/alecthomas/chroma/v2/quick" "github.com/yuin/goldmark" highlighting "github.com/yuin/goldmark-highlighting/v2")

func main() { source := []byte("```gopackage main

import \\"fmt\\"

func main() { fmt.Println(\\"Hello, world!\\")}```") markdown := goldmark.New( goldmark.WithExtensions( highlighting.Highlighting,

推荐