今晚比赛几比几?用Golang写一个实时比分查询工具,让看球更简单

说实话,写这篇文章的起因特别简单,昨晚朋友突然问我:“今晚比赛几比几?”我正盯着手机翻来覆去刷了好几页网页,才找到那个藏在广告堆里的比分...

说实话,写这篇文章的起因特别简单,昨晚朋友突然问我:“今晚比赛几比几?”我正盯着手机翻来覆去刷了好几页网页,才找到那个藏在广告堆里的比分,那一刻我就想,能不能自己写个小工具,一运行就能告诉我“今晚比赛几比几”?于是就有了这篇用 Golang 实现的实时比分查询指南。

为什么选Golang来做这件事?

你可能觉得,查个比分而已,爬个网页不就行了?还真不是,我们要查的“今晚比赛几比几”包含很多细节:比赛时间、主客队、实时比分、甚至还有“已结束”“进行中”这些状态,如果用Python,依赖包一大堆,部署还麻烦,用 Golang 就不一样了——编译成单个二进制文件,丢到服务器上就跑,连环境都不用配。

而且Golang的协程(goroutine)特别适合同时查多场比赛,比如你想知道“今晚比赛几比几”是足球还是篮球?没关系,我们一次查三个赛事,几秒钟就出来。

第一步:确定数据源

“今晚比赛几比几”这个信息,不能瞎编,我们需要一个可靠的 体育数据API,免费的有不少,

API名称 免费额度 返回格式 是否需要注册
API-Football 每天100次 JSON 需要
OpenLigaDB 无限制 JSON 不需要
TheSportsDB 有限制 JSON 需要

我选的是 OpenLigaDB,因为它的 免费额度 很大,而且返回的数据很干净,没有广告,你只需要记住它的接口地址就行了,比如查德甲比赛,它会给你一个很清晰的JSON。

第二步:写核心代码——从“今晚比赛几比几”变成一个URL

我们直接上代码,用Golang的 net/http 库发一个 GET 请求:

package main
import (
    "encoding/json"
    "fmt"
    "net/http"
    "time"
)
// 定义一个结构体来映射API返回的JSON
type Match struct {
    MatchID       int    `json:"MatchID"`
    Team1         string `json:"Team1"`
    Team2         string `json:"Team2"`
    MatchResults  []struct {
        PointsTeam1 int `json:"PointsTeam1"`
        PointsTeam2 int `json:"PointsTeam2"`
    } `json:"MatchResults"`
    MatchDateTime string `json:"MatchDateTime"`
}

这段代码里,我们定义了一个 Match 结构体,每个字段映射到API返回的JSON键,关键点在于 MatchResults 这个切片——因为比赛可能有好几个结果(比如加时赛、点球大战),但我们只关心第一个。

然后我们写一个函数,专门来回答“今晚比赛几比几”这个问题:

func getScore(team1, team2 string) string {
    // 拼接URL,这里以OpenLigaDB为例
    url := fmt.Sprintf("https://api.openligadb.de/getmatchdata/%s/%s/%s", team1, team2, time.Now().Format("2006-01-02"))
    resp, err := http.Get(url)
    if err != nil {
        return "网络出问题了,稍后再查"
    }
    defer resp.Body.Close()
    var matches []Match
    json.NewDecoder(resp.Body).Decode(&matches)
    if len(matches) == 0 {
        return "今晚没有比赛"
    }
    // 取第一场比赛的比分
    match := matches[0]
    score := fmt.Sprintf("%s %d : %d %s", match.Team1, match.MatchResults[0].PointsTeam1, match.MatchResults[0].PointsTeam2, match.Team2)
    return score
}

这个函数干的事很简单:接受队名,返回比分,如果API返回空数组,就告诉用户“今晚没有比赛”,注意那个 time.Now().Format("2006-01-02"),Golang里这个奇怪的日期格式其实是固定写法,别写成 YYYY-MM-DD 哦。

第三步:让程序能同时查多场比赛

“今晚比赛几比几”往往不是一场,而是好几场同时进行,比如今晚有英超、西甲、还有NBA,用Golang的 goroutine 就很方便:

func main() {
    // 用map存赛程,key是赛事名称,value是对应的队伍或ID
    leagues := map[string]string{
        "英超": "英超队伍...", // 实际需要传入联赛ID
        "西甲": "西甲队伍...",
        "NBA": "NBA队伍...",
    }
    ch := make(chan string, len(leagues))
    for name, query := range leagues {
        go func(n, q string) {
            ch <- fmt.Sprintf("%s: %s", n, getScore(q))
        }(name, query)
    }
    // 收集结果
    for i := 0; i < len(leagues); i++ {
        fmt.Println(<-ch)
    }
}

这里用了一个无缓冲channel来同步goroutine的结果,跑起来效果大概是:

英超: 利物浦 2 : 1 曼联
西甲: 巴萨 0 : 0 皇马
NBA: 湖人 105 : 98 凯尔特人

你看,几秒钟内就知道“今晚比赛几比几”了,比翻网页快多了。

第四步:加一点人性化的输出

光输出比分太干了,我们加点 状态判断:如果比赛还没开始,就显示“今晚几点开始”;如果已经结束,就显示“已结束,比分是……”。

修改 getScore 函数:

// 判断比赛状态
if match.MatchResults == nil {
    // 没有结果说明比赛还未开始
    return fmt.Sprintf("%s vs %s 还没开始,开赛时间: %s", match.Team1, match.Team2, match.MatchDateTime)
} else {
    // 有结果就显示比分
    score := match.MatchResults[0]
    if score.PointsTeam1 == 0 && score.PointsTeam2 == 0 {
        return fmt.Sprintf("%s vs %s 正在进行中,0:0", match.Team1, match.Team2)
    }
    return fmt.Sprintf("%s %d : %d %s", match.Team1, score.PointsTeam1, score.PointsTeam2, match.Team2)
}

这样你问“今晚比赛几比几”,程序会告诉你:

  • 如果没踢:“利物浦 vs 曼联 还没开始,开赛时间:2025-04-15 22:00”
  • 如果踢完了:“利物浦 3 : 1 曼联”
  • 如果0:0平局:“利物浦 vs 曼联 正在进行中,0:0”

真实使用中的小问题

写这个程序的时候,我踩了几个坑,得如实告诉你

今晚比赛几比几?用Golang写一个实时比分查询工具,让看球更简单

  1. API的日期格式:OpenLigaDB接受 yyyy-MM-dd 格式日期,但Golang的 time.Now() 默认带时区,得用 time.Now().In(time.UTC).Format(...) 避免时区差异,我就吃过这亏,查出来“今晚比赛几比几”显示的是昨天。

  2. 比分切片索引越界:有些API返回的 MatchResults 是空数组,这时候直接取 [0] 会panic,所以上面代码里我加了 if len(matches) > 0if match.MatchResults != nil 的判断。

  3. 网络超时:免费API偶尔会慢,最好加个 http.Client 的超时设置:

    client := &http.Client{Timeout: 10 * time.Second}
    resp, err := client.Get(url)

你还能怎么扩展?

这个基础代码写完后,你可以加很多功能

  • 支持命令行参数./live-score "利物浦" 直接查该队今晚比赛几比几
  • 保存历史比分:把查到的数据存到SQLite里,以后回顾
  • 做个小网站:用Gin框架搭个网页,显示所有比赛的实时比分

我后来把自己这个工具部署到了树莓派上,每天定时跑一次,然后发邮件给我,朋友再问我“今晚比赛几比几”,我直接回一句“./live-score 自己看”,就挺爽的。

对了,那个API的 rate limit 要注意,免费版一般每分钟最多100次请求,如果你循环查太多比赛,会被暂时封IP,解决办法是加个 time.Sleep() 或者用 sync.WaitGroup 控制并发数。

写在最后

其实写这个工具,最让我开心的是那种掌控感,以前看比赛比分,全依赖别人的App和网页,偶尔还弹广告,现在只要打开终端,敲一行命令,“今晚比赛几比几”就用最干净的方式告诉我,而且Golang编译出的文件就几兆,u盘都能装下,走哪儿带哪儿。

如果你也经常被问到“今晚比赛几比几”,或者自己就想第一时间知道比分,试着跑跑这段代码,改改参数,加点自己的功能,很快它就会变成你离不开的小工具,可能代码会有bug,可能API会变,但那种“自己动手解决问题”的快乐,是别人直接给你一个App比不了的。

本文来自作者[kyadmin]投稿,不代表678体育 - 全网热门体育赛事高清直播平台立场,如若转载,请注明出处:http://www.seanway.cn/nba/958.html

(4)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-23

    我是678体育 - 全网热门体育赛事高清直播平台的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-23

    希望本篇文章《今晚比赛几比几?用Golang写一个实时比分查询工具,让看球更简单》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-23

    本站[678体育 - 全网热门体育赛事高清直播平台]内容主要涵盖:678体育,678体育官网,678赛事直播

  • kyadmin
    kyadmin 2026-07-23

    本文概览:说实话,写这篇文章的起因特别简单,昨晚朋友突然问我:“今晚比赛几比几?”我正盯着手机翻来覆去刷了好几页网页,才找到那个藏在广告堆里的比分...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们