用Go语言写一只体育鼠?这事儿还真能成

一个程序员在健身房里找到的编程灵感你有没有过这种体验——凌晨两点,你盯着屏幕上的报错日志,感觉整个人像被榨干的柠檬片,然后你刷到一个...

一个程序员在健身房里找到的编程灵感

你有没有过这种体验——凌晨两点,你盯着屏幕上的报错日志,感觉整个人像被榨干的柠檬片,然后你刷到一个健身博主说:“今天练胸,三组平板卧推,每组12次。” 你默默看了一眼自己平躺的肚子,心想:我连体育都不算,我就是个鼠。

对,这个“鼠”不是骂人,是自嘲,程序员圈子里,长期熬夜、久坐、靠咖啡续命的人,常被叫“体育鼠”——体育废柴,代码小老鼠,但我想说的是,我最近还真用Go语言写了个小项目,名字就叫“体育鼠”,不是我疯了,是这事儿挺有意思的。

什么是“体育鼠”?

《体育鼠》是一个用Go语言写的命令行小工具,功能很简单:根据你今天想练的身体部位(胸、背、腿、肩、手臂),随机给你推荐一套动作组合,比如你输入chest,它就会输出一组动作和次数建议,听起来像是一个健身App的入门版,但这背后的编程逻辑,其实涉及了很多Go语言的核心特性。

用Go语言写一只体育鼠?这事儿还真能成

我用这个项目是因为——我发现很多新手程序员想学Go,但不知道从哪下手,面向对象、并发、接口、错误处理……这些概念干巴巴地学太磨人,但如果把它们打包在一个“体育鼠”里,一边写代码一边假装自己在筹划明天的训练计划,学习曲线就平滑多了

Go语言里藏着健身房的哲学

为什么用Go?我承认,最开始只是想蹭“体育鼠”这个名字的热度,但写着写着,我发现Go语言的一些设计理念,和健身还真有异曲同工之妙。

  • 简单直接:Go没有继承、没有重载,就像健身里的基础动作——深蹲就是深蹲,别整花里胡哨的变式。
  • 错误处理严格:Go要求你显式处理每一个错误,就像你在卧推时必须有保护者,不然就是push yourself too hard。
  • 并发是内置的:goroutine是你的训练搭档,它能帮你在热身的时候同时做完拉伸和激活。

体育鼠的核心数据结构

先看核心代码结构,我用一个结构体表示每个动作:

字段类型说明
Namestring动作名称(如“平板卧推”)
MuscleGroupstring目标肌群(如“chest”)
Repsint建议次数(8-12)
Setsint组数(3-4)
Difficultystring难度(beginner/intermediate/expert)

然后我用一个切片存了大概60多个动作,按肌群分类,你可以把它想象成你的私人动作库——就像你打开健身房的装备柜,里面塞满了各种颜色的哑铃

随机推荐算法?其实就是一个很莽的shuffle

你可能以为我会用一个复杂的算法,比如基于用户历史数据或者RPE(自主感觉用力评分),但不好意思,我直接用了rand.Shuffle,每次你运行命令,程序从对应肌群的动作池里随机抽取3个,输出给终端。

这就好比一个新手走进健身房,不知道该练什么,我告诉你:“行,今天练胸,你试试这三个动作,数量我看着写了,你自己掂量。”虽不完美,但够用。

我还加了一个小彩蛋——每天第一次运行时,会额外输出一句随机鸡汤。“今天你比昨天强,不管练没练。”

为什么用命令行而不是GUI?

因为我懒,命令行工具对于程序员来说,是最不设门槛的东西,你打开终端,输入sportsrat --chest,啪,输出出来,你不用打开App、不用看广告、不用忍受那些“7天减掉小肚腩”的垃圾推送。

而且Go的交叉编译太强了,我在Mac上写的代码,直接可以编译成Windows和Linux的可执行文件。这就叫“一次编写,到处运行”,比你在健身房跑了一个月的椭圆机还没瘦下来强吧?

并发:你热身的时候它能干点别的

Go的goroutine让我可以在程序里同时做两件事,比如你在做第一组训练的时候(主goroutine),程序后台在帮你缓存训练日、根据你的反馈调整下一次的推荐内容(子goroutine),虽然我的“体育鼠”还没智能到这个程度,但理论上可以做。

我用了一个简单的sync.WaitGroup来控制:主程序输出你的训练计划,同时后台把一个日志写进文件,记录你今天练了什么,你看,这就是并行——就像你在做弯举的时候,你的手机在帮计时

体育鼠的日常使用场景

我现在每天早上起床,直接敲一行命令:

sportsrat --today

它会输出:

  • 热身:5分钟开合跳+肩环绕
  • 主项目:哑铃推举(4组×10次),侧平举(3组×12次),面拉(3组×15次)
  • 冷身:拉伸三角肌前中后束

我照着做,做完之后在终端里敲一个done,程序就会记录今天的训练,两个月下来,我确实规律了一些,虽然腹肌还没出来,但写代码的时候明显清醒了。

技术细节:我踩的坑和犯的迷糊

讲真,这个项目写起来并不顺,我一开始想用JSON文件存数据,结果encoding/json在解析嵌套结构的时候报错了三次,后来发现是因为我把字段名写成了小写开头(Go里小写开头是私有字段,JSON解析不了)。

这个bug卡了我一个下午。 后来我在一个健身论坛上发帖问问题,结果没人回,最后自己翻文档才搞清楚,嗯,这就是程序员的日常——你以为是智商问题,其实只是拼写出错

还有一个坑是随机数种子的问题,早期版本里,我直接用了rand.Intn,但忘记设置种子了,结果每次运行推荐的动作都一样,这就好比你每次去健身房,你的教练都叫你做同样的动作——不致命,但很蠢。

健身体验和编程体验的对照表

健身编程
训练计划不科学算法设计不合理
动作做错了容易受伤API用错了容易产生bug
增肌需要蛋白质合成代码需要编译成机器码
健身搭档能帮你突破极限代码评审能帮你避免低级错误
休息日也很重要正经写代码前要做设计

这张表我写在项目的README里了,算是自己的一个反思记录,虽然不权威,但挺真实。

体育鼠的未来?说实话我也没想好

这个项目现在还在我的本地仓库里,没有上线,我偶尔会改几个bug,加几个新动作,有人建议我做成Web服务加数据库,但我觉得那就失去了“体育鼠”的气质——它就应该是一个小小的、毛茸茸的、在终端里折腾的小玩意儿。

或许以后我会加一个--motivate参数,输出一些打鸡血的话,也可能会加一个--partner模式,让两个用户能互相比拼推进度,用goroutine发消息,但那是以后的事。

现在它就安安静静地躺在我电脑里,每天晚上我打开它,它对我说:“今天你练了吗?” 有时候我练了,有时候没练,但至少,我写了一个属于我自己的“体育鼠”。它不完美,但它是我的。

对了,如果你也想试试,记得去Go的官网装一个环境,代码我就不贴了,你大概能猜到结构,然后你把它编译了,运行一下,看看它会让你练什么,要是它推荐了一组很奇怪的动作——别笑,那就是我故意写的,毕竟,体育鼠从来不按常理出牌

本文来自作者[kyadmin]投稿,不代表ac米兰官网立场,如若转载,请注明出处:http://milanatour.com/tiyu/155.html

(5)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-06-13

    我是ac米兰官网的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-06-13

    希望本篇文章《用Go语言写一只体育鼠?这事儿还真能成》能对你有所帮助!

  • kyadmin
    kyadmin 2026-06-13

    本站[ac米兰官网]内容主要涵盖:AC米兰,ac米兰中文,AC米兰官网

  • kyadmin
    kyadmin 2026-06-13

    本文概览:一个程序员在健身房里找到的编程灵感你有没有过这种体验——凌晨两点,你盯着屏幕上的报错日志,感觉整个人像被榨干的柠檬片,然后你刷到一个...

    联系我们

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

    关注我们