嘿,跑完黄河口马拉松的朋友们,是不是一过终点线就急着翻手机查成绩?我懂那种感觉,汗还在滴、腿还在抖,就想看看自己到底跑了多少,但有时候官方页面卡得不行,或者你想要的不是简单查个名次,而是想把自己的成绩跟去年比、跟朋友比,甚至自己搞个统计小工具,这时候,要是能用 Golang 自己写个查询程序,是不是挺酷的?
其实没那么复杂,先想想“查成绩”到底在查什么
你打开官方查询页面,输入参赛号,跳出来一行数据:姓名、枪声成绩、净成绩、排名、分段计时……背后其实就是服务器返回了一堆JSON或HTML数据,我们写个小程序,本质就是:
- 发个请求(模拟你在网页上点查询)
- 拿到数据(解析返回的内容)
- 展示出来(按你想要的格式打出来)
Golang的 net/http 包干这事儿特别顺手,而且编译完就一个二进制文件,扔服务器上跑都不用装依赖,比Python那种还得考虑环境的感觉清爽多了。
第一步:搭个最简单查询框架
先别想太多,就用 命令行程序 跑起来,你输入参赛号,它帮你查。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("用法: go run query.go 你的参赛号")
return
}
bib := os.Args[1] // 参赛号
url := "https://api.huanghekou-marathon.com/result?bib=" + bib
resp, err := http.Get(url)
if err != nil {
fmt.Println("网络不行啊兄弟:", err)
return
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
你看,这就十几行的事,但这里有个问题:黄河口马拉松官方API地址是什么? 实际开发中,你得先去官网的“成绩查询”页面,按F12看网络请求,找到真正的接口,比如它可能是 POST 方式,或者需要带个 token,这个你得自己动手抓一下,教是教不来的,但方法就是“打开浏览器开发者工具 → 网络 → 查一次成绩 → 看请求”。
第二步:把数据拆开看,别让它糊在一起
上面那个程序打印出来的多半是一整坨JSON,看起来眼睛疼,我们得把有用的字段挑出来,假设返回数据长这样:
{
"status": 0,
"data": {
"name": "张三",
"bib": "A1234",
"gun_time": "03:24:56",
"net_time": "03:22:10",
"rank": 128,
"age_group": "30-39",
"group_rank": 15
}
}
Golang处理JSON用 encoding/json 包,我一般先定义一个结构体,把想要的字段列出来:
type Result struct {
Name string `json:"name"`
Bib string `json:"bib"`
GunTime string `json:"gun_time"`
NetTime string `json:"net_time"`
Rank int `json:"rank"`
GroupRank int `json:"group_rank"`
}
然后解析:
var res Result
json.Unmarshal(body, &res)
fmt.Printf("选手: %s 参赛号: %s\n", res.Name, res.Bib)
fmt.Printf("枪声成绩: %s 净成绩: %s\n", res.GunTime, res.NetTime)
fmt.Printf("总排名: %d 年龄组排名: %d\n", res.Rank, res.GroupRank)
你看,这样是不是清楚多了?而且你还可以加个条件:如果净成绩比你的PB(个人最好成绩)快,就打印个“破PB啦!” 这种小把戏,自己写代码最有意思。
第三步:别只查自己,把朋友圈的也查一遍
一个人查多没劲,你可以把朋友的参赛号也放进去,批量查,比如弄个切片:
bibs := []string{"A1234", "B5678", "C9012"}
for _, bib := range bibs {
// 查成绩逻辑...
// 顺便比一下谁快
}
甚至可以把结果存到一个 表格 里,打印出来更直观:
| 选手姓名 | 参赛号 | 净成绩 | 总排名 | 年龄组排名 |
|---|---|---|---|---|
| 张三 | A1234 | 3:22:10 | 128 | 15 |
| 李四 | B5678 | 3:45:02 | 312 | 42 |
| 王五 | C9012 | 4:10:33 | 587 | 89 |
在Golang里用 fmt.Printf 配合制表符 \t 就可以对齐,或者用第三方库 tablewriter 画得更漂亮,我有时候就这么干——把一帮跑友的成绩拉下来,跑得慢的请吃烧烤,愿赌服输嘛。
第四步:加个“防卡死”机制
比赛结束那几天,官方服务器压力大,请求可能超时,你可以用 http.Client 设置超时:
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Get(url)
如果超时了,打印一句“服务器累了,等会儿再试”,比直接崩掉友善多了,你还能加个 重试机制,最多试三次,每次间隔2秒,这在实际查询中特别管用——我自己跑北马查成绩就这么干过,官方页面挂了,但我自己写的脚本反而查到了,因为它在默默重试。

第五步:整点高级的——把数据存本地
每次跑完马拉松,我只查一次就完了?不,我想保存下来,以后回头看:2025年黄河口跑了3小时22分,2026年跑了3小时18分……这不就是自己的跑步日记吗?
你可以把结果写进本地 CSV 文件,以后用Excel打开:
file, _ := os.OpenFile("results.csv", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
defer file.Close()
writer := csv.NewWriter(file)
writer.Write([]string{res.Name, res.Bib, res.NetTime, fmt.Sprintf("%d", res.Rank)})
writer.Flush()
下回再查,就直接往后面追加,几年后你打开这个CSV,看到自己成绩一点点提升,那感觉比查成绩本身还爽。
一点真实建议
Golang做这种小工具的优势在于 编译快、部署简单,你可以在自己电脑上写完了,编译成Windows或Mac的可执行文件,发给朋友直接用,都不用安装Go环境,我就经常这么干——跑团群里有人问“谁帮我查下成绩”,我直接扔个exe过去,对方双击就能用(当然要提前说一声信任问题)。
黄河口马拉松的官方查询页面如果你觉得排版不好看,完全可以自己写个 本地网页版,用Golang做后端,启动一个HTTP服务,在浏览器里输入参赛号查,那就更接近一个“微型网站”了,不过那是另一个话题了,今天先到这。
你去官网上找找那个API吧,找着了,十几行代码就能跑起来,然后把自己的成绩配上那个“破PB”的彩蛋,跑完步还能乐一下,多好。
本文来自作者[kyadmin]投稿,不代表678体育 - 全网热门体育赛事高清直播平台立场,如若转载,请注明出处:http://www.seanway.cn/ly/865.html
评论列表(4条)
我是678体育 - 全网热门体育赛事高清直播平台的签约作者“kyadmin”!
希望本篇文章《黄河口马拉松成绩查询,用Golang写个自己查自己的小工具》能对你有所帮助!
本站[678体育 - 全网热门体育赛事高清直播平台]内容主要涵盖:678体育,678体育官网,678赛事直播
本文概览:嘿,跑完黄河口马拉松的朋友们,是不是一过终点线就急着翻手机查成绩?我懂那种感觉,汗还在滴、腿还在抖,就想看看自己到底跑了多少,但有时候官...