如何在Golang中实现简单的博客系统_Golang文章发布与管理实践


net/http 足够支撑初期博客 CRUD,应避免在 handler 中写业务逻辑、操作文件或数据库,而用显式 ServeMux、JSON 文件存储、blackfriday/v2 安全渲染、validator 统一校验,并保持数据模型与 HTTP 层解耦。

net/http 搭建基础路由,别急着上框架

Go 自带的 net/http 足够支撑初期博客的 CRUD,加框架反而增加理解成本和部署复杂度。重点是把请求路径、方法、数据绑定逻辑理清楚。

常见错误:直接在 http.HandleFunc 里写业务逻辑,导致函数臃肿、无法测试、难以复用。

  • 每个路由 handler 应只做三件事:解析请求(r.URL.Query()json.NewDecoder(r.Body))、调用 service 层函数、写响应(json.NewEncoder(w).Encode()
  • 避免在 handler 中操作文件或数据库连接——这些应封装进独立函数,便于单元测试和替换
  • 使用 http.ServeMux 显式注册路由,比默认 http.DefaultServeMux 更可控,也方便后续加中间件(如日志、认证)

文章存储用 JSON 文件就够了,先别碰数据库

早期博客内容少、并发低、无事务需求,用 os.WriteFile 写入结构化 JSON 到 ./data/posts/ 目录,比 SQLite 或 PostgreSQL 启动快、备份简单、调试直观。

容易踩的坑:多个请求同时写同一个文件导致数据丢失。

  • 给每篇文章生成唯一 ID(推荐 uuid.NewString()),文件名即 ID,避免中文或空格命名
  • 读取时用 os.ReadFile + json.Unmarshal;写入前先 os.MkdirAll("./data/posts", 0755)
  • 不要用 os.OpenFile(..., os.O_APPEND) 追加——JSON 不支持追加,必须整文件重写
  • 若需原子写入,可先写到临时文件(tmp := path.Join(dir, id+".tmp")),再 os.Rename

解析 Markdown 用 blackfriday/v2,但注意 XSS 风险

blackfriday/v2 是目前最稳定的 Go Markdown 解析器,支持自定义 renderer,适合博客正文渲染。

关键问题:用户提交的 Markdown 可能含恶意 HTML(如 ),直接渲染会引发 XSS。

  • 务必启用安全选项:html.WithUnsafe(false)(默认就是 false,但显式写出更稳妥)
  • 若需保留部分 HTML(如 ),应配合 bluemonday 做白名单过滤,而不是关掉 WithUnsafe
  • 标题自动锚点、表格样式、代码块高亮需自定义 html.Renderer,不要依赖默认输出
  • 示例中不要用 blackfriday.Run([]byte(md)) —— 它已弃用,改用 markdown.ToHTML(v2 API)

发布流程卡在表单验证?用结构体标签 + validator

手动检查 title != ""len(content) > 10 很容易漏,且分散在各 handler 中。统一用 go-playground/validator 结合 struct tag 约束。

典型场景:新建文章时前端传了空 title 或超长 slug。

  • 定义结构体时用 validate:"required,min=1,max=100" 等 tag,字段名保持小写(Title string `json:"title" validate:"required"`
  • 验证失败时,用 err.(validator.ValidationErrors) 提取具体字段和规则,返回 JSON 错误(如 {"field":"title","error":"required"}
  • slug 自动生成逻辑放 service 层,不要依赖前端传入;可用 strings.ToLower(strings.ReplaceAll(title, " ", "-")) 简单处理
  • 注意:validator 默认不校验嵌套结构体,如有 Metadata 字段需加 validate:"dive"
type Post struct {
	ID       string `json:"id"`
	Title    string `json:"title" validate:"required,min=1,max=100"`
	Slug     string `json:"slug" validate:"required,alphanumdash"`
	Content  string `json:"content" validate:"required,min=10"`
	CreatedAt time.Time `json:"created_at"`
}

func (p *Post) Validate() error {
	return validator.New().Struct(p)
}

真正难的不是写完发布功能,而是当某天想加分类、标签、草稿箱时,发现当初没把数据模型和 HTTP 层解耦——那时再重构,比从头写还费劲。


# html  # js  # 前端  # markdown  # json  # go  # golang  # app  # 路由  # 博客系统  # 数据丢失  # red  # 中间件  # xss  # String  # 封装  # 表单验证  # Error  # 结构体  # Struct  # len  # 并发  # sqlite  # postgresql  # 数据库  # http  # 重构  # 博客  # 自定义  # 时用  # 装进  # 若需  # 多个  # 如有  # 很容易  # 要用  # 重写 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何优化Golang内存分配与GC调度_Golang垃圾回收优化示例  Win11怎么设置任务栏图标大小_Windows11注册表TaskbarSi修改  Win11声音太小怎么办_Windows 11开启响度均衡增强音量【技巧】  c++怎么使用std::tuple存储多元组数据_c++ 11获取元素与解包操作【技巧】  Windows怎样拦截WPS弹窗广告_Windows拦截WPS弹窗广告设置【步骤】  C++中引用和指针有什么区别?(代码说明)  Win11怎么打开旧版计算器_Win11恢复传统计算器应用【详解】  Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理  如何自定义Windows终端的默认配置文件?(PowerShell/CMD)  Windows10如何删除Windows.old_Win10磁盘清理系统文件选项  Django密码修改后会话失效的解决方案  Win11怎么检查TPM2.0模块_Windows11受信任平台模块开启状态查询  如何使用Golang benchmark测量函数延迟_统计执行耗时  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  php修改数据怎么改富文本_update更新html内容注意事项【说明】  Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】  Win11快速助手怎么用_Win11远程协助连接教程【工具】  Win11文件夹预览图不显示怎么办_Win11缩略图缓存重建修复【教程】  c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】  php转mp4怎么保留字幕_php处理带字幕视频转换说明【说明】  PythonWeb前后端整合项目教程_FastAPIReact完整实例  php订单日志怎么在swoole写_php协程swoole写订单日志教程【教程】  Go语言中slice追加操作的底层共享机制详解  Win11如何设置电源计划_Win11电源计划优化教程【攻略】  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  Windows7如何安装系统镜像_Windows7系统安装教程【步骤】  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Windows10电脑怎么设置文件权限_Win10安全选项卡所有者修改  如何使用Golang安装API文档生成工具_快速生成接口文档  Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选  Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】  Win10怎么更改用户名 Win10修改账户名称操作教程  php订单日志怎么按金额排序_php按订单金额排序日志方法【方法】  Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】  Windows任务计划服务异常原因_任务调度失败的处理方案  PHP主流架构如何处理会话管理_Session与Cookie【技巧】  Win11怎么设置快速访问_Windows11文件资源管理器主页  mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】  Win11怎么制作U盘启动盘_Win11原版系统安装盘制作【详解】  如何在包含多值的列中精准搜索指定演员?  如何使用Golang log设置日志输出格式_Golang log日志格式示例  mac怎么查看wifi密码_MAC查看已连接WiFi密码方法【技巧】  如何使用Golang匿名函数_快速定义临时函数逻辑  如何使用Golang包导出规则_控制函数和变量可见性  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】  Python列表推导式与字典推导式教程_简化代码高效写法  Win11怎样彻底卸载自带应用_Win11彻底卸载自带应用方法【步骤】  Mac如何开启夜览模式_Mac护眼模式设置与定时  如何在Golang中使用replace替换模块_指定本地或远程路径 

 2026-01-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.