0

0

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

P粉602998670

P粉602998670

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

|

809人浏览过

|

来源于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") 返回空字符串
  • 内容长度校验建议限制在 1500 字符,避免恶意长文本拖慢服务
  • 务必对用户输入做 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 安全得多。

国洋商务通
国洋商务通

Gyb2b V1.01免费版可终身使用,是一款功能强大的B2B电子商务应用软件。该软件不仅更新和修改了V1.0相关功能,更是采用了目前互联网上最流行的LAMP组合(Linux+Apache+Mysql+PHP)开发完成,模板技术实现了界面与代码的有效分离,用户可以快速地在此基础上编译模板;提供B2B电子商务应用最常见的求购、供应、商品、公司库、行业资讯、商圈、资信认证、在线交易、交易评分、留言、搜

下载
  • 模板中不要写 {{.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 节点插入到

底部。重点防重复提交和 UI 反馈。

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

  • 提交按钮点击后立即 disabled = true,防止连点;响应返回后再恢复
  • fetchbody 必须是 URLSearchParamsFormData,不能直接传对象字面量
  • 服务端返回的 idcreated 时间必须和后端一致,否则前端时间显示会错乱
  • 插入新留言时,用 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 = `${data.created} ${data.content}`;
		document.getElementById('msg-list').prepend(item);
		input.value = '';
	}
	btn.disabled = false;
});

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

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

547

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

373

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

729

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

471

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

655

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

549

2023.09.20

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.07

热门下载

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

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号