去提问»
提问背景 Question:
就算没有md语法,也得有换行吧。

Go后端Markdown渲染换行问题排查

发布时间:2026-08-18 15:16 👁️ 阅读:5

针对你提到的“没有Markdown语法也无法换行”的问题,这通常是因为 Goldmark 渲染引擎默认遵循 CommonMark 规范,将单次换行视为空格,而不是 <br> 标签。即使你手动处理了 ,解析器在渲染时依然会忽略它。建议从以下三个维度排查并解决:

1. 开启 Goldmark 的硬换行支持(核心方案)

ConvertMarkdown 函数中,Goldmark 的默认解析是不支持 HardLineBreak 的。你需要显式配置它,使所有换行都渲染为 <br>

func ConvertMarkdown(mdContent string) template.HTML {
    // 初始化解析器时开启 HardLineBreak
    md := goldmark.New(goldmark.WithExtensions(
        extension.NewRenderer(extension.WithHardLineBreak()),
    ))
    var buf bytes.Buffer
    if err := md.Convert([]byte(mdContent), &buf); err != nil {
        return template.HTML(mdContent)
    }
    return template.HTML(buf.String())
}

2. 检查 CSS 样式控制

即便渲染出了 <br> 标签,如果前端页面 CSS 对容器设置了 white-space: nowrap 或者容器没有触发自动折行,内容也会挤在一起。请检查渲染内容的容器是否包含以下样式:

.content-container {
    white-space: pre-wrap; /* 强制保留换行并自动换行 */
    word-wrap: break-word;
}

3. 模板输出方式

确保在 HTML 模板中,你是直接输出处理后的 template.HTML,而不是用 {{ .Content | text }} 这种可能导致二次转义的方式。标准写法应为:

<div>{{ .Article.Content }}</div>

排查步骤建议:

  1. 查看生成的源码:在浏览器按下 F12 查看渲染后的 HTML,确认数据库读出的内容中 是否真的被替换成了真实的换行符。
  2. 检查 Goldmark 版本:确认是否正确导入了 github.com/yuin/goldmark 及相关的 extension 包。
  3. 空行测试:如果你在输入框中输入内容时用了两个换行(即空一行),Markdown 语法会自动识别为 <p> 标签。如果只有单行换行不生效,说明必须开启上述 WithHardLineBreak() 选项。