当前位置:首页 > 体育 > 正文

世界杯小组赛积分榜单排名,用golang写个程序自己算,比看球还上头

  • 体育
  • 2026-07-01 16:37:40
  • 47
摘要: 世界杯小组赛踢得热火朝天,积分榜上你追我赶,说实话,每次看积分表我都得掏出手机算半天——赢一场3分,平一场1分,输球0分,净胜球...

世界杯小组赛踢得热火朝天,积分榜上你追我赶,说实话,每次看积分表我都得掏出手机算半天——赢一场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    // 红牌数(少的好)
}

这玩意儿一写出来,感觉世界杯就在我电脑里踢了。

小组赛积分规则,其实就这几条

国际足联那套规则看着挺长,核心就三点:

  1. 积分高排名靠前——胜3分平1分负0分
  2. 同分看净胜球——进球多失球少的是高手
  3. 净胜球一样看进球数——谁更能进球谁上去

万一这些全一样,就看相互交手记录,再不行就抽签——我是没见过抽签的,但理论上可能存在,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排序逻辑的细致。

如果要处理更复杂的相互战绩——比如两队完全相同的情况,那就得额外写个函数对比它们直接交锋的结果,我试过,代码量会多一段,但逻辑还是一样清晰。

一些值得注意的点,写代码时容易踩坑

写这个排名程序时,我踩了几个坑,也跟你说说:

  1. 排序是降序还是升序——默认sort.Slice是升序,排积分得反过来用>
  2. 浮点数别搞——净胜球和进球数全是整数,用int就行,别整float64
  3. 黄牌数量少的好——纪律分那个排序得反过来写,我一开始写反了,结果罚牌最多的排第一,闹笑话了

golang的强类型在这时候特别友好,编译时就帮你检查类型错误,不像动态语言写一长串才发现类型不对。

你能拿这个程序干啥?不止排个名

写完这个小组赛排名器之后,你会发现它还能干别的:

  • 预测出线形势——把假设的比赛结果输进去,提前算算最后一轮打平就能出线的情况
  • 多组对比——把所有小组的积分榜跑一遍,看看哪个小组的第二名最有机会以成绩最好的第三名晋级
  • 历史数据分析——把往届世界杯小组赛数据输进去,看看规律

我之前把2018年世界杯小组赛全跑了一遍,发现golang算出来的排名跟当时实际排名一模一样,说明代码写得还行,同时也证明国际足联那帮人确实没瞎搞。

这东西写完之后,每次世界杯小组赛我都拿它来对——直接输入比分,看它算出来跟我判断是不是一致,有时候熬夜看球脑子糊涂了,程序给出的结果反而比我清醒。

要说golang和世界杯有什么共同点,大概就是:都讲究规则清晰、结果明确、在相同条件下能一次次复现,你说是不是?

世界杯小组赛积分榜单排名,用golang写个程序自己算,比看球还上头

发表评论