答案:使用Golang和Gin框架可快速实现留言回复系统,通过Message和Reply结构体定义数据模型,内存存储模拟数据库,设计提交留言、查看留言和添加回复的路由接口,结合HTML模板渲染前端页面,支持留言按时间倒序展示与嵌套回复功能。

用Golang开发一个简单的留言回复系统并不复杂,关键在于理清数据结构、路由设计和前后端交互方式。下面通过一个实战示例,带你一步步实现一个基础但功能完整的留言回复系统。
我们要实现的基本功能包括:
定义核心结构体:
type Message struct {
ID int `json:"id"`
Content string `json:"content"`
Username string `json:"username"`
CreatedAt time.Time `json:"created_at"`
Replies []Reply `json:"replies"`
}
<p>type Reply struct {
ID int <code>json:"id"</code>
Content string <code>json:"content"</code>
Username string <code>json:"username"</code>
MessageID int <code>json:"message_id"</code>
CreatedAt time.Time <code>json:"created_at"</code>
}</p>使用内存存储模拟数据库,适合快速验证逻辑:
var messages = make(map[int]Message) var replies = make(map[int][]Reply) var messageIDCounter = 1 var replyIDCounter = 1
推荐使用 Gin 框架,轻量且性能高。先安装依赖:
go get -u github.com/gin-gonic/gin
初始化路由和服务器:
func main() {
r := gin.Default()
r.LoadHTMLGlob("templates/*")
<pre class='brush:php;toolbar:false;'>r.GET("/", getMessages)
r.POST("/message", createMessage)
r.POST("/reply", createReply)
r.Run(":8080")}
获取所有留言(含回复)
NoCode
美团推出的零代码应用生成平台
180
查看详情
func getMessages(c *gin.Context) {
var result []Message
for _, msg := range messages {
msg.Replies = replies[msg.ID]
result = append(result, msg)
}
// 按时间倒序
sort.Slice(result, func(i, j int) bool {
return result[i].CreatedAt.After(result[j].CreatedAt)
})
c.HTML(200, "index.html", gin.H{"messages": result})
}
创建新留言
func createMessage(c *gin.Context) {
var form struct {
Username string `form:"username" binding:"required"`
Content string `form:"content" binding:"required"`
}
<pre class='brush:php;toolbar:false;'>if err := c.ShouldBind(&form); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
msg := Message{
ID: messageIDCounter,
Username: form.Username,
Content: form.Content,
CreatedAt: time.Now(),
}
messages[messageIDCounter] = msg
messageIDCounter++
c.Redirect(302, "/")}
添加回复
func createReply(c *gin.Context) {
var form struct {
MessageID int `form:"message_id" binding:"required"`
Username string `form:"username" binding:"required"`
Content string `form:"content" binding:"required"`
}
<pre class='brush:php;toolbar:false;'>if err := c.ShouldBind(&form); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
reply := Reply{
ID: replyIDCounter,
MessageID: form.MessageID,
Username: form.Username,
Content: form.Content,
CreatedAt: time.Now(),
}
replies[form.MessageID] = append(replies[form.MessageID], reply)
replyIDCounter++
c.Redirect(302, "/")}
在项目根目录创建 templates/index.html:
<!DOCTYPE html>
<html>
<head><title>留言系统</title></head>
<body>
<h2>发表留言</h2>
<form method="post" action="/message">
<input type="text" name="username" placeholder="用户名" required />
<textarea name="content" placeholder="输入留言内容" required></textarea>
<button type="submit">提交</button>
</form>
<p><hr/>
<h2>所有留言</h2>
{{range .messages}}
<div style="border:1px solid #ccc; margin:10px; padding:10px;">
<p><strong>{{.Username}}</strong> ({{.CreatedAt.Format "2006-01-02 15:04"}})</p>
<p>{{.Content}}</p></p><pre class='brush:php;toolbar:false;'> <!-- 回复表单 -->
<form method="post" action="/reply" style="margin:10px 0;">
<input type="hidden" name="message_id" value="{{.ID}}" />
<input type="text" name="username" placeholder="用户名" required />
<input type="text" name="content" placeholder="回复内容" required />
<button type="submit">回复</button>
</form>
<!-- 显示回复 -->
{{range .Replies}}
<div style="margin-left:20px; font-size:0.9em; color:#555;">
<strong>{{.Username}}</strong>: {{.Content}}
({{.CreatedAt.Format "15:04"}})
</div>
{{end}}
</div>{{end}}
以上就是如何用Golang开发简单的留言回复系统_Golang 留言回复系统实战的详细内容,更多请关注其它相关文章!
# js
# html
# golang
# github
# go
# json
# git
# 前端
# 爱站seo日志分析
# 搜狐网站推广方案设计怎么写
# 表单
# 解决问题
# 留言内容
# 中文网
# 相关文章
# 推荐使用
# 文件上传
# 如何用
# 数据结构
# gola
# gin框架
# 路由
# ai
# 后端
# app
# 建设标准查询网站
# 网站建设需求说明书
# 吉安技术营销推广
# 阜新网站收费推广
# 抚州seo什么价格
# 关键词排名流量软件
# 网络营销推广平台模式
# 工厂抖音企业号关键词排名
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
《律学法考》查看学习数据方法
猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程
CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现
支付宝登录刷脸不是本人如何解决
Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】
手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧
电脑视频号|直播|如何分享屏幕
mysql怎么导入sql文件_mysql导入sql文件的方法与技巧
Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】
J*aScript类型数组_TypedArray使用
附近酒吧怎么找?
铁路12306官网入口 铁路12306中国铁路官网登录首页
Go语言反射机制:如何访问被嵌入结构体遮蔽的方法
mysql中外键约束如何使用_mysql FOREIGN KEY操作
微信网页版在线登录 微信网页版在线使用入口
Go语言反射机制下访问嵌入结构体中的被遮蔽方法
Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南
《随手记》关闭首页消息推送方法
多多买菜门店端app订单查看方法
海棠阅读登录教程_详细讲解海棠登录操作
《环球网校》设置报考省市方法
Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件
米侠浏览器插件无法启用怎么办 米侠浏览器扩展兼容性修复
怎么恢复删除的电脑文件_数据恢复软件使用教程
J*aScript二进制处理_ArrayBuffer与Blob
《理想汽车》权限管理设置方法
哔哩哔哩黑名单怎么查看
《桃源记2》资源采集攻略
在PHP环境中正确加载HTML资源:CSS样式与图片路径指南
夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】
J*aScript字符串_Unicode处理
在Django单元测试中优雅处理信号:基于环境的条件执行策略
漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口
奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧
word文档行距怎么调?word文档调行距的操作步骤
b站怎么查看视频的码率_b站视频码率查看方法
苹果手机怎么合并照片_苹果手机合并多张照片的操作方法
QQ网站入口直接登录 QQ官方正版登录页面
GBA模拟器手柄按键设置
铁路12306怎么申请退票_铁路12306退票申请操作流程
《爱笔思画x》魔棒工具抠图教程
qq邮箱格式填写示例 qq邮箱标准填写规范
基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口
谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达
《蓝色星原:旅谣》坐骑获取攻略
b站怎么用微信登录_b站微信登录方法
Bootstrap 5导航栏折叠功能失效:数据属性迁移指南
J*aScript大数运算_BigInt使用指南
iPhone17Pro如何连接蓝牙耳机_iPhone17Pro蓝牙设备配对与连接方法介绍
4399造梦西游3无敌版_4399游戏入口
2025-11-24
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。