世界杯小组赛积分榜单排名,用golang写个程序自己算,比看球还上头
- 体育
- 2026-07-01 16:37:40
- 47
世界杯小组赛踢得热火朝天,积分榜上你追我赶,说实话,每次看积分表我都得掏出手机算半天——赢一场3分,平一场1分,输球0分,净胜球、进球数、相互战绩……脑子不够用啊,正好上半年刚学了点golang,直接写个程序帮我算排名,顺便把规则捋清楚。
为什么不用Excel?因为golang写起来更爽
你可能会说,Excel拉个表格不就行了?但世界杯小组赛有各种细则:同分比净胜球,净胜球一样比进球数,再一样看相互战绩,要是涉及到红黄牌纪律分,那更复杂,用golang写个结构体,把每支球队的数据塞进去,再实现排序接口,跑一次就能看到完整排名。
先定义个球队数据结构:
type Team struct {
Name string // 球队名字,quot;巴西"、"德国"
Points int // 积分
GoalFor int // 进球数
GoalAgainst int // 失球数
GoalDiff int // 净胜球
YellowCards int // 黄牌数(少的好)
RedCards int // 红牌数(少的好)
}
这玩意儿一写出来,感觉世界杯就在我电脑里踢了。
小组赛积分规则,其实就这几条
国际足联那套规则看着挺长,核心就三点:
- 积分高排名靠前——胜3分平1分负0分
- 同分看净胜球——进球多失球少的是高手
- 净胜球一样看进球数——谁更能进球谁上去
万一这些全一样,就看相互交手记录,再不行就抽签——我是没见过抽签的,但理论上可能存在,golang里实现这个排序,直接调sort.Slice就完事了。
用golang写个排序,比看球还过瘾
来看实际代码怎么写,先制造几个虚拟球队数据——咱就拿2022年卡塔尔世界杯小组赛举例:
teams := []Team{
{"荷兰", 7, 5, 1, 4, 3, 0},
{"塞内加尔", 6, 5, 4, 1, 5, 1},
{"厄瓜多尔", 4, 4, 3, 1, 4, 0},
{"卡塔尔", 0, 1, 7, -6, 6, 2},
}
你看,卡塔尔三战全败,积分0,净胜球-6,黄牌还不少,这下直接垫底,荷兰队两胜一平,净胜球+4,稳稳的小组第一。
排序逻辑这么写:
sort.Slice(teams, func(i, j int) bool {
if teams[i].Points != teams[j].Points {
return teams[i].Points > teams[j].Points
}
if teams[i].GoalDiff != teams[j].GoalDiff {
return teams[i].GoalDiff > teams[j].GoalDiff
}
if teams[i].GoalFor != teams[j].GoalFor {
return teams[i].GoalFor > teams[j].GoalFor
}
// 相互战绩和纪律分比较麻烦,得单独处理
return true
})
就这么几行,积分榜单就生成了,我跑了一次,输出结果跟我熬夜看球的印象一模一样——荷兰第一,塞内加尔第二,厄瓜多尔第三,卡塔尔回家,代码不会撒谎,虽然它比我的黑眼圈还诚实。
实战:用真实数据跑一次小组赛排名
我手头有小组赛A组的完全数据,包括黄牌和相互战绩,拿golang跑完,排名如下:
| 排名 | 球队 | 场次 | 胜 | 平 | 负 | 进球 | 失球 | 净胜球 | 积分 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 荷兰 | 3 | 2 | 1 | 0 | 5 | 1 | +4 | 7 |
| 2 | 塞内加尔 | 3 | 2 | 0 | 1 | 5 | 4 | +1 | 6 |
| 3 | 厄瓜多尔 | 3 | 1 | 1 | 1 | 4 | 3 | +1 | 4 |
| 4 | 卡塔尔 | 3 | 0 | 0 | 3 | 1 | 7 | -6 | 0 |
塞内加尔和厄瓜多尔净胜球都是+1,但塞内加尔进球数5个,厄瓜多尔才4个,所以塞内加尔排第二,这里就体现了golang排序逻辑的细致。
如果要处理更复杂的相互战绩——比如两队完全相同的情况,那就得额外写个函数对比它们直接交锋的结果,我试过,代码量会多一段,但逻辑还是一样清晰。
一些值得注意的点,写代码时容易踩坑
写这个排名程序时,我踩了几个坑,也跟你说说:
- 排序是降序还是升序——默认
sort.Slice是升序,排积分得反过来用> - 浮点数别搞——净胜球和进球数全是整数,用int就行,别整float64
- 黄牌数量少的好——纪律分那个排序得反过来写,我一开始写反了,结果罚牌最多的排第一,闹笑话了
golang的强类型在这时候特别友好,编译时就帮你检查类型错误,不像动态语言写一长串才发现类型不对。
你能拿这个程序干啥?不止排个名
写完这个小组赛排名器之后,你会发现它还能干别的:
- 预测出线形势——把假设的比赛结果输进去,提前算算最后一轮打平就能出线的情况
- 多组对比——把所有小组的积分榜跑一遍,看看哪个小组的第二名最有机会以成绩最好的第三名晋级
- 历史数据分析——把往届世界杯小组赛数据输进去,看看规律
我之前把2018年世界杯小组赛全跑了一遍,发现golang算出来的排名跟当时实际排名一模一样,说明代码写得还行,同时也证明国际足联那帮人确实没瞎搞。
这东西写完之后,每次世界杯小组赛我都拿它来对——直接输入比分,看它算出来跟我判断是不是一致,有时候熬夜看球脑子糊涂了,程序给出的结果反而比我清醒。
要说golang和世界杯有什么共同点,大概就是:都讲究规则清晰、结果明确、在相同条件下能一次次复现,你说是不是?

发表评论