为什么突然想用 Go 写 NBA 排行榜?
昨晚刷手机,看到朋友在群里晒了一张 NBA 历史总得分榜的截图,我盯着那个 勒布朗·詹姆斯 的名字看了半天,心想:这些数据要是能用代码自己抓下来、自己排一排,那得多带劲?
我打开了 Golang,说实话,Go 语言写这种数据处理的小工具,真的挺顺手的,你不需要搞一堆复杂的依赖,一个 net/http 加上 encoding/json,基本就能把事儿办了。
第一步:数据从哪儿来?
NBA 官方其实有公开的 API,但直接调有点麻烦,我找了个第三方的开源接口——balldontlie API,它提供球员赛季数据,包括总得分,你也可以用 SportsRadar 或者 NBA Stats 的官方数据,不过那得申请 key。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"sort"
)
type PlayerStats struct {
ID int json:"id"
FirstName string json:"first_name"
LastName string json:"last_name"
Points float64 json:"pts"
Season int json:"season"
}

第二步:怎么排序?
拿到数据后,我用了 Go 标准库的 sort.Slice,按分数降序排列,代码其实就几行:
sort.Slice(players, func(i, j int) bool {
return players[i].Points > players[j].Points
})
但这里有个坑——有些球员打了很多赛季,而有的只打了几个赛季,如果直接按总得分排,对年轻球员不公平,所以我加了个 “赛季场均得分” 的指标,作为辅助参考。
第三步:展示结果,顺便加点“人味儿”
数据排好了,怎么展示?我偷了个懒,直接在终端里打印成表格,也可以用 Go 的 text/template 做成 HTML 页面,但命令行看起来更 geek 一点。
| 排名 | 球员 | 总得分 | 赛季数 |
| 1 | LeBron James | 38652 | 20 |
| 2 | Kareem Abdul-Jabbar | 38387 | 20 |
| 3 | Karl Malone | 36928 | 19 |
| 4 | Kobe Bryant | 33643 | 20 |
| 5 | Michael Jordan | 32292 | 15 |
你看,乔丹只打了15个赛季,拿第五名,这要算场均得分,他才真是天花板,Go 的排序逻辑我还特意加了个 “场均得分超过20分” 的过滤器,不然一堆角色球员进来,看着乱。
第四步:动态更新排行榜
比赛每天都在打,数据也得跟着变,我写了个小脚本,每天定时跑一次,把 NBA 官方数据 抓下来重排,Go 的 time.Ticker 挺好用:
ticker := time.NewTicker(24 * time.Hour)
for range ticker.C {
fetchAndUpdateRanking()
}
但说实话,API 有时候会限流,所以我加了个重试机制,每次失败后等30秒再试,Go 的 time.Sleep 虽然简单,但配合 for 循环用,挺稳的。
第五步:收尾——写点心里话
弄完这个排行榜,我突然觉得,技术有时候就是为了满足那点好奇心,你想知道谁是历史得分王?用 Go 写个爬虫加排序,半小时搞定,想实时跟踪?加个定时任务,想分享给朋友?打出来贴群里就行。
我这个版本还很糙,比如没做并发优化,如果一次要处理几百个球员的数据,http.Get 串行发请求会慢。又不是不能用,对吧?
我把代码扔到了 GitHub 上,备注写的是:“用 Go 给篮球迷写的小玩具”,如果你也喜欢篮球和代码,可以试试改一改,比如加上三分命中率、罚球数什么的——我懒得搞了,但你想搞的话,记得把 sort.Slice 的排序条件改一下就行。
行了,今晚骑士队比赛快开始了,我得赶紧看一眼詹姆斯还能不能再往上冲一冲。
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.b22b.cn/nba/9.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《用 Golang 手撸一个 NBA 总分排行榜,这事儿还挺上头的》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:为什么突然想用Go写NBA排行榜?昨晚刷手机,看到朋友在群里晒了一张NBA历史总得分榜的截图,我盯着那个勒布朗·詹姆斯...