讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

如何使用Golang开发留言板应用_Golang留言提交与显示实现方法

冬枫大大_4838

冬枫大大_4838

发布时间:2026-01-06 08:09:08

|

829人浏览过

|

来源于php中文网

原创

Go留言板需前后端分离:后端用net/http实现带校验的提交API(含ParseForm、长度限制、html.EscapeString转义、JSON响应),前端用fetch动态渲染,模板用html/template自动转义,核心是明确转义责任、时间格式控制和错误处理边界。

如何使用golang开发留言板应用_golang留言提交与显示实现方法

Go 语言本身不直接处理前端渲染,留言提交与显示必须拆解为「后端 API 接口」和「前端页面交互」两部分;强行用 net/http 拼 HTML 模板虽能跑通,但很快会陷入路由混乱、XSS 漏洞、表单重复提交等实际问题。

用 net/http 实现留言提交接口(带基础校验)

核心是接收 POST 表单、验证非空、存入内存切片(开发阶段可接受)、返回 JSON 响应。注意:生产环境必须换数据库,且需加 CSRF 防护。

  • r.ParseForm() 必须调用,否则 r.FormValue("content") 返回空字符串
  • 内容长度校验建议限制在 1–500 字符,避免恶意长文本拖慢服务
  • 务必对用户输入做 html.EscapeString() 再存储,否则前端直接 innerHTML 渲染会触发 XSS
  • 响应头要显式设置 w.Header().Set("Content-Type", "application/json; charset=utf-8"),否则前端 fetch 可能解析失败
func submitHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != "POST" {
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}
	r.ParseForm()
	content := strings.TrimSpace(r.FormValue("content"))
	if content == "" || len(content) > 500 {
		http.Error(w, "Invalid content", http.StatusBadRequest)
		return
	}
	msg := Message{
		ID:      len(messages) + 1,
		Content: html.EscapeString(content),
		Created: time.Now().Format("2006-01-02 15:04"),
	}
	messages = append(messages, msg)
	json.NewEncoder(w).Encode(map[string]interface{}{"ok": true, "id": msg.ID})
}

用 html/template 渲染留言列表(避免手动拼接)

模板文件(如 index.html)里用 {{.}} 或 {{range .}} 渲染数据,Go 后端通过 template.Execute 注入结构体切片。关键点是模板自动转义,比手写 fmt.Sprintf 安全得多。

DeepBI DHTML 页面生成器
DeepBI DHTML 页面生成器

生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur

下载
  • 模板中不要写 {{.Content|safe}} 除非你 100% 确认内容已过滤——这会绕过默认转义
  • 传入模板的数据必须是导出字段(首字母大写),如 Content 而非 content
  • 若需时间格式化,在模板中用 {{.Created | printf "%.16s"}} 截取,比在 Go 层预格式化更灵活
func indexHandler(w http.ResponseWriter, r *http.Request) {
	tmpl, _ := template.ParseFiles("index.html")
	tmpl.Execute(w, messages)
}

前端用 fetch 提交并动态追加留言(不刷新页面)

提交成功后,不要重载整个页面,而是用 JavaScript 解析 JSON 响应,生成 DOM 节点插入到 <div id="msg-list"> 底部。重点防重复提交和 UI 反馈。<p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">go语言免费学习笔记(深入)</a>”;</p> <ul> <li>提交按钮点击后立即 <code>disabled = true,防止连点;响应返回后再恢复

  • fetch 的 body 必须是 URLSearchParams 或 FormData,不能直接传对象字面量
  • 服务端返回的 id 和 created 时间必须和后端一致,否则前端时间显示会错乱
  • 插入新留言时,用 document.createElement + element.innerHTML 是安全的,因为后端已做 html.EscapeString
  • document.getElementById('submit-btn').addEventListener('click', async () => {
    	const input = document.getElementById('content-input');
    	const btn = event.target;
    	btn.disabled = true;
    	const res = await fetch('/submit', {
    		method: 'POST',
    		body: new URLSearchParams({ content: input.value })
    	});
    	const data = await res.json();
    	if (data.ok) {
    		const item = document.createElement('div');
    		item.className = 'message';
    		item.innerHTML = `<span class="time">${data.created}</span> ${data.content}`;
    		document.getElementById('msg-list').prepend(item);
    		input.value = '';
    	}
    	btn.disabled = false;
    });

    真正卡住多数人的不是语法,而是没想清楚「谁负责转义」「谁控制时间格式」「错误时前端怎么提示」——这些边界一旦模糊,后续加数据库、分页、登录态就会层层套娃。先用内存存、先跑通端到端流程,再逐个替换组件,比一上来就设计“高可用留言板”实际得多。

    热门AI工具

    更多
    创客贴AI

    创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

    二狗PPT
    二狗PPT Hot

    一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

    DeepSeek

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

    码上飞
    码上飞 Hot

    一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

    Atoms
    Atoms Hot

    Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

    墨刀AI
    墨刀AI Hot

    一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

    WorkBuddy

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

    咔片AIPPT

    一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

    豆包大模型

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

    相关专题

    更多
    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、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    1296

    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结构体相关大全,想了解更多内容,请阅读专题下面的文章。

    5414

    2025.06.09

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

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

    2514

    2025.06.10

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

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

    4366

    2025.06.17

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

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

    0

    2026.11.12

    热门下载

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

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    WebStorm 官方调试文档
    WebStorm 官方调试文档

    共0课时 | 0人学习

    React 教程
    React 教程

    共58课时 | 12.5万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 6.8万人学习

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

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