Go投票系统核心是用sync.RWMutex保护的map实现内存存储:Votes记录选项票数,Voted去重用户ID;提供/vote(防重提交)和/results(JSON返回统计)两个HTTP接口,支持单机轻量部署。
用 Go 语言开发一个简单投票系统,核心在于:定义投票结构、处理用户提交(防重复)、安全计数、提供结果接口。不需要数据库也能跑起来,适合学习和轻量部署。
数据结构与内存存储设计
投票系统最简实现可用内存 map 模拟存储,适合单机、小流量场景:
用
map[string]int
记录每个选项的票数(如
)
用
map[string]bool
或
map[string]struct{}
记录已投票用户 ID(如 IP 或 token),防止刷票
定义结构体封装状态,便于后续扩展:
HTTP 接口实现(投票 + 查询)
使用标准
即可,两个关键接口:
POST /vote
:接收 JSON 投票请求,校验用户是否已投,更新计数
示例请求:
GET /results
:返回当前各选项票数及总票数,支持 JSON 输出
返回示例:
注意加锁(
/
)避免并发写冲突。
立即学习
“
go语言免费学习笔记(深入)
”;
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
防重复投票的关键逻辑
仅靠
前端
限制不可靠,服务端必须校验:
提取唯一用户标识:可用
(推荐)、
session
token 或哈希后的 IP(不精准但够用)
在
处理中先查
,存在则返回
成功投票后立即写入
和
运行与测试建议
启动后用
curl
快速验证流程:
投一票:
查结果:
再投同用户会失败,说明防重生效
后续可平滑升级:把 map 换成 Redis 存储、加 JWT 验证、支持多轮投票、添加管理后台等。
votes["Go"] = 12type VoteSystem struct {
Votes map[string]int
Voted map[string]struct{} // 用户标识去重
mu sync.RWMutex
}net/http{"user_id":"u123", "option":"Rust"}{"Go":42,"Rust":28,"Zig":5,"total":75}mu.Lock()mu.RLock()user_id/votevoted[user_id]400 Bad Requestvoted[user_id] = struct{}{}votes[option]++curl -X POST http://localhost:8080/vote -H "Content-Type: application/json" -d '{"user_id":"alice","option":"Go"}'curl http://localhost:8080/results