Go投票系统核心是用sync.RWMutex保护的map实现内存存储:Votes记录选项票数,Voted去重用户ID;提供/vote(防重提交)和/results(JSON返回统计)两个HTTP接口,支持单机轻量部署。

用 Go 语言开发一个简单投票系统,核心在于:定义投票结构、处理用户提交(防重复)、安全计数、提供结果接口。不需要数据库也能跑起来,适合学习和轻量部署。
数据结构与内存存储设计
投票系统最简实现可用内存 map 模拟存储,适合单机、小流量场景:
- 用 map[string]int 记录每个选项的票数(如
votes["Go"] = 12) - 用 map[string]bool 或 map[string]struct{} 记录已投票用户 ID(如 IP 或 token),防止刷票
- 定义结构体封装状态,便于后续扩展:
type VoteSystem struct {
Votes map[string]int
Voted map[string]struct{} // 用户标识去重
mu sync.RWMutex
}
HTTP 接口实现(投票 + 查询)
使用标准 net/http 即可,两个关键接口:
-
POST /vote:接收 JSON 投票请求,校验用户是否已投,更新计数
示例请求:{"user_id":"u123", "option":"Rust"} -
GET /results:返回当前各选项票数及总票数,支持 JSON 输出
返回示例:{"Go":42,"Rust":28,"Zig":5,"total":75}
注意加锁(mu.Lock() / mu.RLock())避免并发写冲突。
立即学习“go语言免费学习笔记(深入)”;
采用三层架构开发,前台集成了产品在线展示,用户注册、在线调查、在线投稿后台有类别管理\图书管理\订单管理\会员管理\配送范围管理\邮件列表\广告管理\友情链接管理等后台添加图书时自动生成缩略图和文字水印主要参考了petshop的设计架构、使用了Asp.net2.0中很多MemberShip、master等新功能后台管理地址/web/admin/ 超级管理员账号密码均为aspx1特别提示:该系统需要
防重复投票的关键逻辑
仅靠前端限制不可靠,服务端必须校验:
- 提取唯一用户标识:可用
user_id(推荐)、session token 或哈希后的 IP(不精准但够用) - 在
/vote处理中先查voted[user_id],存在则返回400 Bad Request - 成功投票后立即写入
voted[user_id] = struct{}{}和votes[option]++
运行与测试建议
启动后用 curl 快速验证流程:
- 投一票:
curl -X POST http://localhost:8080/vote -H "Content-Type: application/json" -d '{"user_id":"alice","option":"Go"}' - 查结果:
curl http://localhost:8080/results - 再投同用户会失败,说明防重生效
后续可平滑升级:把 map 换成 Redis 存储、加 JWT 验证、支持多轮投票、添加管理后台等。









