说实话,写这篇文章的起因特别简单,昨晚朋友突然问我:“今晚比赛几比几?”我正盯着手机翻来覆去刷了好几页网页,才找到那个藏在广告堆里的比分,那一刻我就想,能不能自己写个小工具,一运行就能告诉我“今晚比赛几比几”?于是就有了这篇用 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”
真实使用中的小问题
写这个程序的时候,我踩了几个坑,得如实告诉你:

-
API的日期格式:OpenLigaDB接受
yyyy-MM-dd格式日期,但Golang的time.Now()默认带时区,得用time.Now().In(time.UTC).Format(...)避免时区差异,我就吃过这亏,查出来“今晚比赛几比几”显示的是昨天。 -
比分切片索引越界:有些API返回的
MatchResults是空数组,这时候直接取[0]会panic,所以上面代码里我加了if len(matches) > 0和if match.MatchResults != nil的判断。 -
网络超时:免费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条)
我是678体育 - 全网热门体育赛事高清直播平台的签约作者“kyadmin”!
希望本篇文章《今晚比赛几比几?用Golang写一个实时比分查询工具,让看球更简单》能对你有所帮助!
本站[678体育 - 全网热门体育赛事高清直播平台]内容主要涵盖:678体育,678体育官网,678赛事直播
本文概览:说实话,写这篇文章的起因特别简单,昨晚朋友突然问我:“今晚比赛几比几?”我正盯着手机翻来覆去刷了好几页网页,才找到那个藏在广告堆里的比分...