去提问»
提问背景 Question:
你刚才的代码中 highlighting.WithFormatters 这句有错误。提示 undefined: highlighting.WithFormatters [linux]

解决 Goldmark 高亮未定义错误

发布时间:2026-08-18 13:50 👁️ 阅读:2

这个错误是因为在 github.com/yuin/goldmark-highlighting/v2 库中,并没有 WithFormatters 这个函数。正确的配置选项函数应当是 WithFormatOptions,并且它接收的是底层高亮渲染器 chroma/v2/formatters/html 的配置参数。

另外,请确保你引入的是最新的 v2 版本。下面是完整的排查与修复方案。

1. 更新与安装正确的依赖包

请在你的项目根目录下执行以下命令,确保引入的是 v2 版本的 Goldmark 高亮插件和 Chroma 渲染器:

go get github.com/yuin/goldmark
go get github.com/yuin/goldmark-highlighting/v2
go get github.com/alecthomas/chroma/v2

2. 修复后的 Go 代码

请将你的后端代码中的 ConvertMarkdown 函数及 import 部分修改为如下内容。注意看 highlighting.WithFormatOptions 的正确写法:

package main

import (
	"bytes"
	"html/template"

	// 1. 引入 chroma 的 html 格式化器
	"github.com/alecthomas/chroma/v2/formatters/html"
	"github.com/yuin/goldmark"
	// 2. 引入 v2 版本的 goldmark-highlighting
	highlighting "github.com/yuin/goldmark-highlighting/v2"
)

func ConvertMarkdown(mdContent string) template.HTML {
	// 初始化高亮插件
	hl := highlighting.NewHighlighting(
		highlighting.WithStyle("monokai"), // 常用主题:monokai, github, dracula, pygments
		highlighting.WithFormatOptions(
			html.WithLineNumbers(true), // 是否显示行号
			
			// 【重要提示】
			// html.WithClasses(false) 表示使用内联样式(Style="color:#fff"),无需前端引入 CSS,开箱即用。
			// 如果你希望通过外部 CSS 控制样式,可以设为 true,但前端需要引入对应的 CSS 类名定义。
			html.WithClasses(false),
		),
	)

	// 注册高亮插件到 goldmark 中
	md := goldmark.New(
		goldmark.WithExtensions(hl),
	)

	var buf bytes.Buffer
	if err := md.Convert([]byte(mdContent), &buf); err != nil {
		// 如果解析失败,进行降级,直接返回原始文本
		return template.HTML(mdContent)
	}

	return template.HTML(buf.String())
}

3. 为什么会出现这个报错?

  1. API 变动与误读:在旧版本的 goldmark-highlighting 中,底层配置较为混乱。在 v2 版本中,官方将底层格式化参数完全托管给了 chroma 本身,通过 highlighting.WithFormatOptions(...) 统一透传。
  2. 包路径不匹配:如果你在 import 中混用了 v1v2 的包,或者拼写成了 WithFormatters,Go 编译器在编译期就会直接报出 undefined 错误。

现在使用上面的代码重新运行 go rungo build,编译即可顺利通过,且 Markdown 中的代码块会被自动转换为带有 Monokai 配色的 HTML 代码。