用Go标准库实现简易投票网站:前端HTML表单以POST提交单选选项,后端用sync.Map内存计数并重定向,/路径动态渲染统计结果与表单,支持实时查看票数变化。

用 Go 开发一个简易投票网站,核心在于:前端表单提交选项,后端接收并持久化计数,再实时展示统计结果。不需要复杂框架,标准库 net/http 和少量 HTML 即可实现。
前端:简洁表单 + 选项提交
写一个静态 HTML 页面(如 index.html),包含投票选项和提交按钮。关键点是使用 POST 方法提交,每个选项用 name="choice" 的单选按钮(radio):
注意:action="/vote" 指向后端处理路径;所有选项共享同一个 name,确保单选互斥。
后台:接收、计数、存储(内存版)
Go 后端用 http.HandleFunc 处理两个路由:/ 返回页面,/vote 接收表单数据。用 sync.Map 安全地在内存中累计票数(适合演示,生产环境应换数据库):
立即学习“go语言免费学习笔记(深入)”;
- 定义全局
var votes = sync.Map{}存储各选项的票数(key=string, value=int64) - 在
/vote处理器中调用r.ParseForm(),再用r.FormValue("choice")获取选中的值 - 用
votes.LoadOrStore(choice, int64(0))初始化,再用atomic.AddInt64增加票数(需先断言为*int64或改用封装结构) - 处理完重定向回
/,避免重复提交
统计展示:动态渲染结果
在 / 的处理器中,遍历 votes 读取所有选项及票数,拼接 HTML 字符串返回(或用 html/template 更清晰):
- 先收集所有选项:可以预设选项列表(
[]string{"go", "rust", "python"}),避免漏显 - 对每个选项,调用
votes.Load(option)获取当前票数,转成整数 - 在 HTML 中以列表或进度条形式展示,例如:Go: 12 票
- 把原始表单也嵌入同一页面,实现“投完即见结果”
运行与验证
启动服务:go run main.go,浏览器访问 http://localhost:8080 即可投票。刷新页面查看统计变化。若需持久化,后续可替换 sync.Map 为 JSON 文件读写,或接入 SQLite。










