用Go实现轻量投票系统:以内存变量存选项,net/http提供/和/vote路由,HTML表单提交后更新票数并重定向,主页实时计算占比并渲染进度条,后续可扩展SQLite、IP限投等功能。

用 Go 语言开发一个简单投票系统,核心在于轻量、可控、不依赖复杂框架。重点不是堆功能,而是把“用户投票 → 数据存取 → 实时统计 → 页面展示”这条链路跑通,且代码清晰可维护。
设计最小可行结构
一个投票系统至少包含三部分:投票选项(如 A/B/C)、用户提交动作、结果统计与展示。不需要登录、不用数据库也能起步——先用内存变量或 JSON 文件存数据,够演示逻辑即可。
- 定义投票项:用结构体表示,含 ID、名称、票数
- 用 map 或 slice 管理所有选项,比如
var options = []Option{...} - 用全局变量或简单结构体封装状态(开发阶段可接受;上线前再抽离为持久化层)
用 net/http 搭建基础 Web 服务
Go 自带的 net/http 足够支撑静态页面 + 表单提交 + API 返回。无需引入 Gin/echo,避免抽象干扰理解。
- 注册两个路由:
/显示投票页(HTML 表单),/vote接收 POST 提交 - 在
/处理函数中生成 HTML(可用字符串拼接或html/template) - 在
/vote中解析表单字段(如r.FormValue("choice")),更新对应选项票数 - 处理完重定向回
/,避免重复提交
实现数据统计与实时展示
统计不是“后台跑任务”,而是每次请求时按当前数据算一次。展示也不必 Ajax——首次加载即渲染完整结果,更直观。
立即学习“go语言免费学习笔记(深入)”;
- 在主页 handler 中,先计算总票数、各选项占比(如
float64(opt.Votes) / float64(total)) - 把统计结果传入模板,用
{{.Options}}渲染列表,用{{.Total}}显示总数 - 加个简单的进度条效果:用内联 style,如
width: {{mul .Percent 100}}%(配合 template func 或预计算) - 如需“实时刷新”,前端加一行 JS 定时 GET
/api/stats并更新 DOM(后端该接口只返回 JSON)
后续可扩展点(按需添加)
跑通主流程后,再考虑增强。每一步都应服务于明确需求,而非提前设计。
- 换用 SQLite:导入
database/sql和_ "github.com/mattn/go-sqlite3",建表、改增查逻辑 - 限制单 IP 投票一次:用 map 记录已投 IP(注意并发安全,加
sync.RWMutex) - 加简单管理页:比如
/admin/reset清空数据(加个简单密码校验即可) - 导出 CSV:新增
/export路由,用encoding/csv写响应体










