讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

如何使用Golang实现一个简易的Web端Markdown编辑器

落静吖_5613

落静吖_5613

发布时间:2026-02-17 13:49:07

|

191人浏览过

|

来源于php中文网

原创

Go只需专注接收Markdown、安全转HTML并返回,前端用轻量编辑器即可;goldmark需配置html.WithUnsafe()和自定义sanitizer白名单防XSS;接口须设JSON Content-Type、限流校验,前端防抖调用并直接渲染HTML。

如何使用golang实现一个简易的web端markdown编辑器

为什么不用现成的前端编辑器(如 CodeMirror、Toast UI)?

因为你要的是「Golang 实现」——重点在后端能力,不是前端渲染。真正需要 Go 做的只有三件事:接收 Markdown 文本、安全转为 HTML、返回给前端。前端编辑器用 textarea 或轻量级库(比如 simplemde)就够了,Go 只管「接、转、吐」。

常见错误是把整个编辑器逻辑塞进 Go:比如想用 Go 渲染实时预览、处理键盘快捷键、做语法高亮……这些该由浏览器完成,Go 做只会卡顿、难调试、跨域麻烦。

  • Go 不该处理 DOM 操作或用户输入事件
  • 所有 HTML 转换必须在服务端完成,不能信前端传来的 __html 字段
  • 若用 blackfriday(已归档),注意它不维护了;推荐 goldmark,默认禁用 XSS,更省心

goldmark 渲染 Markdown 时怎么防 XSS?

goldmark 默认不开 HTML 标签,但如果你允许用户粘贴含 <script></script> 的内容,又没配好选项,照样中招。关键不是“关不关 HTML”,而是「明确声明哪些标签/属性可保留」。

实操建议:

立即学习“go语言免费学习笔记(深入)”;

  • 用 goldmark.WithExtensions() 启用基础扩展(表格、脚注等),但别加 goldmark.Extender 自定义危险节点
  • 必须显式配置 html.WithUnsafe() —— 听起来反直觉,但这是「启用 HTML 解析」的开关;没它,<div> 会被原样转义 <li>真正防 XSS 靠 <code>html.WithSanitizer(),传入自定义函数,只放行 <p></p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill11922" title="Markdown Docs Full-Text Search"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20cf0281539.jpg" alt="Markdown Docs Full-Text Search" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill11922" title="Markdown Docs Full-Text Search">Markdown Docs Full-Text Search</a> <p>使用 SQLite FTS5 对结构化 Markdown 文档库进行全文搜索,适用于需要快速、高效搜索大量 Markdown 文章的场景。</p> </div> <a href="/xiazai/skill11922" title="Markdown Docs Full-Text Search" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>、<pre class="brush:php;toolbar:false;">&lt;/code&gt;、&lt;code&gt;&lt;code&gt;&lt;/code&gt;、&lt;code&gt;&lt;strong&gt;&lt;/code&gt; 等白名单标签&lt;/li&gt; &lt;li&gt;别用 &lt;code&gt;bluemonday&lt;/code&gt; 二次过滤——goldmark 自带 sanitizer 更轻、更可控&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;示例关键片段:&lt;/p&gt; &lt;pre class='brush:php;toolbar:false;'&gt;md := goldmark.New( goldmark.WithExtensions(extension.GFM), goldmark.WithRendererOptions( html.WithUnsafe(), // 允许解析原始 HTML html.WithSanitizer(func(tag string, attrs []html.Attribute) bool { allowed := map[string]bool{&quot;p&quot;: true, &quot;code&quot;: true, &quot;pre&quot;: true, &quot;strong&quot;: true, &quot;em&quot;: true} return allowed[tag] }), ), )</pre> <h3>POST 接口接收 Markdown 内容要注意什么?</h3> <p>很多人写 <code>http.HandleFunc("/render", ...),直接读 r.Body,结果中文乱码、换行丢失、超长文本截断——根本原因是没设 Content-Type 和读取方式。

    正确做法:

    • 前端必须发 Content-Type: application/json,字段名统一用 content(别用 markdown 或 text,易和 Form 表单混淆)
    • Go 后端用 json.NewDecoder(r.Body).Decode(&req),而不是 r.FormValue("content") —— 后者只适用于 application/x-www-form-urlencoded
    • 加 http.MaxBytesReader 限制请求体大小,比如 1MB:http.MaxBytesReader(w, r, 1024*1024),否则恶意大文件会耗尽内存
    • 别在 handler 里做复杂渲染——先校验长度(如 len(req.Content) ),再交给 <code>goldmark 处理

    前端怎么和 Go 渲染接口配合最省事?

    别写一堆 AJAX 状态管理。一个 textarea + 一个 div#preview + 一个防抖提交就够了。

    要点:

    • 用 input 或 keyup 事件监听编辑区,但加 300ms 防抖,避免每敲字都发请求
    • 请求用 fetch("/render", { method: "POST", body: JSON.stringify({content: text}) }),别漏 headers: {"Content-Type": "application/json"}
    • 响应直接赋值给 preview.innerHTML —— 因为 goldmark 输出的是安全 HTML,不用再 DOMPurify.sanitize()
    • 如果预览区样式错乱(比如代码块没高亮),说明你漏了 CSS:goldmark 不生成 class,要自己加 <pre class="brush:php;toolbar:false;">&lt;code class=&quot;go&quot;&gt;&lt;/code&gt;,然后靠 &lt;code&gt;highlight.js&lt;/code&gt; 渲染</pre>

    容易被忽略的一点:Go 返回的 JSON 必须是 {"html": "..."} 结构,前端别去拆 response.text() 再手动 parse —— 直接 response.json() 取 html 字段。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

539

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

616

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1276

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

811

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1886

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5394

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

2514

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

4346

2025.06.17

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Markdown标记语言快速入门
Markdown标记语言快速入门

共30课时 | 4.5万人学习

vscode常用插件与markdown语法介绍
vscode常用插件与markdown语法介绍

共10课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn