一个程序员在健身房里找到的编程灵感
你有没有过这种体验——凌晨两点,你盯着屏幕上的报错日志,感觉整个人像被榨干的柠檬片,然后你刷到一个健身博主说:“今天练胸,三组平板卧推,每组12次。” 你默默看了一眼自己平躺的肚子,心想:我连体育都不算,我就是个鼠。
对,这个“鼠”不是骂人,是自嘲,程序员圈子里,长期熬夜、久坐、靠咖啡续命的人,常被叫“体育鼠”——体育废柴,代码小老鼠,但我想说的是,我最近还真用Go语言写了个小项目,名字就叫“体育鼠”,不是我疯了,是这事儿挺有意思的。
什么是“体育鼠”?
《体育鼠》是一个用Go语言写的命令行小工具,功能很简单:根据你今天想练的身体部位(胸、背、腿、肩、手臂),随机给你推荐一套动作组合,比如你输入chest,它就会输出一组动作和次数建议,听起来像是一个健身App的入门版,但这背后的编程逻辑,其实涉及了很多Go语言的核心特性。

我用这个项目是因为——我发现很多新手程序员想学Go,但不知道从哪下手,面向对象、并发、接口、错误处理……这些概念干巴巴地学太磨人,但如果把它们打包在一个“体育鼠”里,一边写代码一边假装自己在筹划明天的训练计划,学习曲线就平滑多了。
Go语言里藏着健身房的哲学
为什么用Go?我承认,最开始只是想蹭“体育鼠”这个名字的热度,但写着写着,我发现Go语言的一些设计理念,和健身还真有异曲同工之妙。
- 简单直接:Go没有继承、没有重载,就像健身里的基础动作——深蹲就是深蹲,别整花里胡哨的变式。
- 错误处理严格:Go要求你显式处理每一个错误,就像你在卧推时必须有保护者,不然就是push yourself too hard。
- 并发是内置的:goroutine是你的训练搭档,它能帮你在热身的时候同时做完拉伸和激活。
体育鼠的核心数据结构
先看核心代码结构,我用一个结构体表示每个动作:
| 字段 | 类型 | 说明 |
| Name | string | 动作名称(如“平板卧推”) |
| MuscleGroup | string | 目标肌群(如“chest”) |
| Reps | int | 建议次数(8-12) |
| Sets | int | 组数(3-4) |
| Difficulty | string | 难度(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
评论列表(4条)
我是ac米兰官网的签约作者“kyadmin”!
希望本篇文章《用Go语言写一只体育鼠?这事儿还真能成》能对你有所帮助!
本站[ac米兰官网]内容主要涵盖:AC米兰,ac米兰中文,AC米兰官网
本文概览:一个程序员在健身房里找到的编程灵感你有没有过这种体验——凌晨两点,你盯着屏幕上的报错日志,感觉整个人像被榨干的柠檬片,然后你刷到一个...