好的,下面是用 Go 语言实现的一个简单的 BMI(Body Mass Index,身体质量指数)计算器,包含中文注释与完整代码,可以直接运行。


一、BMI 计算公式

BMI=体重(kg)身高2(m2)\text{BMI} = \frac{\text{体重(kg)}}{\text{身高}^2(m^2)} BMI=身高2m2体重(kg

例如:
体重 = 70 kg,身高 = 1.75 m
BMI = 70 / (1.75 * 1.75)


二、Go 实现代码(完整可运行)

package mainimport ("fmt"
)func main() {var weight, height float64// 输入体重(kg)fmt.Print("请输入您的体重(kg):")_, err := fmt.Scan(&weight)if err != nil {fmt.Println("输入体重有误,请输入数字")return}// 输入身高(米)fmt.Print("请输入您的身高(米):")_, err = fmt.Scan(&height)if err != nil {fmt.Println("输入身高有误,请输入数字")return}// 检查输入合理性if weight <= 0 || height <= 0 {fmt.Println("体重和身高必须大于 0")return}// 计算 BMIbmi := weight / (height * height)// 输出 BMI 值fmt.Printf("您的 BMI 指数是:%.2f\n", bmi)// 判断 BMI 分类var category stringif bmi < 18.5 {category = "偏瘦"} else if bmi < 24 {category = "正常"} else if bmi < 28 {category = "偏胖"} else {category = "肥胖"}fmt.Printf("您的体重状态:%s\n", category)
}

三、代码说明

功能说明
输入体重 & 身高使用 fmt.Scan 从控制台读取用户输入的 float64 类型数据
错误处理检查输入是否为合法数字,防止程序因错误输入崩溃
合理性检查体重和身高必须 > 0
BMI 计算按公式 体重(kg) / (身高(m) * 身高(m)) 计算
BMI 分类(中文标准)**- BMI < 18.5:偏瘦
- 18.5 ≤ BMI < 24:正常
- 24 ≤ BMI < 28:偏胖
- BMI ≥ 28:肥胖

📌 注意:BMI 分类标准根据中国成人标准略有调整,可根据需求修改阈值。


四、运行示例

请输入您的体重(kg):70
请输入您的身高(米):1.75
您的 BMI 指数是:22.86
您的体重状态:正常

好的,下面分别给出:

  1. 带图形界面(GUI)的 BMI 计算器 —— 使用 Go 的 GUI 库 fyne 实现
  2. 带 Web 版的 BMI 计算器 —— 使用 Go 标准库 net/http 实现一个简单的网页版 BMI 计算器

GUI 版 BMI 计算器(使用 Fyne)

1. 介绍

  • 使用 Go 的跨平台 GUI 库 fyne
  • 支持 Windows / macOS / Linux,图形化输入与结果显示
  • 需要先安装 fyne

2. 安装 Fyne

在终端运行:

go get fyne.io/fyne/v2/app
go get fyne.io/fyne/v2/widget
go get fyne.io/fyne/v2/container
go get fyne.io/fyne/v2/dialog

或者直接:go get fyne.io/fyne/v2(推荐,会安装所有必要子包)

3. 完整代码(中文界面 + 功能完整)

package mainimport ("fmt""strconv""fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/dialog""fyne.io/fyne/v2/widget"
)func main() {// 创建应用myApp := app.New()myWindow := myApp.NewWindow("BMI 计算器(GUI版)")// 输入组件weightEntry := widget.NewEntry()weightEntry.SetPlaceHolder("请输入体重(kg)")heightEntry := widget.NewEntry()heightEntry.SetPlaceHolder("请输入身高(m)")// 结果显示标签resultLabel := widget.NewLabel("BMI 指数与健康状态将显示在这里")// 计算按钮点击事件calculateBMI := func() {weightStr := weightEntry.TextheightStr := heightEntry.Textweight, err1 := strconv.ParseFloat(weightStr, 64)height, err2 := strconv.ParseFloat(heightStr, 64)if err1 != nil || err2 != nil {dialog.ShowError(fmt.Errorf("请输入有效的数字"), myWindow)return}if weight <= 0 || height <= 0 {dialog.ShowError(fmt.Errorf("体重和身高必须大于 0"), myWindow)return}bmi := weight / (height * height)var status stringif bmi < 18.5 {status = "偏瘦"} else if bmi < 24 {status = "正常"} else if bmi < 28 {status = "偏胖"} else {status = "肥胖"}result := fmt.Sprintf("您的 BMI 指数是:%.2f\n体重状态:%s", bmi, status)resultLabel.SetText(result)}// 计算按钮calcButton := widget.NewButton("计算 BMI", calculateBMI)// 布局inputContainer := container.NewVBox(widget.NewLabel("BMI 计算器"),widget.NewLabel("体重(kg):"),weightEntry,widget.NewLabel("身高(米):"),heightEntry,calcButton,resultLabel,)myWindow.SetContent(inputContainer)myWindow.Resize(fyne.NewSize(300, 300))myWindow.ShowAndRun()
}

Web 版 BMI 计算器(使用 net/http)

1. 介绍

  • 使用 Go 标准库 net/http + html/template 实现
  • 打开浏览器访问本地 Web 页面,输入数据并计算 BMI
  • 适合部署到服务器,供多人使用

2. 完整代码(Web BMI 计算器)

package mainimport ("fmt""html/template""log""net/http""strconv"
)// HTML 模板
const htmlForm = `
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>BMI 计算器(Web版)</title>
</head>
<body><h2>BMI 计算器</h2><form method="POST" action="/">体重(kg): <input type="text" name="weight" required><br><br>身高(米): <input type="text" name="height" required><br><br><input type="submit" value="计算 BMI"></form>{{if .BMI}}<hr><h3>计算结果:</h3><p>BMI 指数:{{.BMI}}</p><p>体重状态:{{.Status}}</p>{{end}}
</body>
</html>
`type BMIResult struct {BMI    float64Status string
}func bmiHandler(w http.ResponseWriter, r *http.Request) {if r.Method == http.MethodGet {// 显示表单tmpl, err := template.New("bmi").Parse(htmlForm)if err != nil {http.Error(w, "模板解析失败", http.StatusInternalServerError)return}tmpl.Execute(w, nil)} else if r.Method == http.MethodPost {// 处理表单提交err := r.ParseForm()if err != nil {http.Error(w, "表单解析失败", http.StatusBadRequest)return}weightStr := r.FormValue("weight")heightStr := r.FormValue("height")weight, err1 := strconv.ParseFloat(weightStr, 64)height, err2 := strconv.ParseFloat(heightStr, 64)if err1 != nil || err2 != nil {http.Error(w, "请输入有效的数字", http.StatusBadRequest)return}if weight <= 0 || height <= 0 {http.Error(w, "体重和身高必须大于 0", http.StatusBadRequest)return}bmi := weight / (height * height)var status stringif bmi < 18.5 {status = "偏瘦"} else if bmi < 24 {status = "正常"} else if bmi < 28 {status = "偏胖"} else {status = "肥胖"}// 返回结果页面tmpl, err := template.New("bmi").Parse(htmlForm)if err != nil {http.Error(w, "模板解析失败", http.StatusInternalServerError)return}result := BMIResult{BMI: bmi, Status: status}tmpl.Execute(w, result)} else {http.Error(w, "不支持的请求方法", http.StatusMethodNotAllowed)}
}func main() {http.HandleFunc("/", bmiHandler)fmt.Println("Web版 BMI 计算器已启动,请打开浏览器访问:http://localhost:8080")log.Fatal(http.ListenAndServe(":8080", nil))
}

3. 如何运行 Web 版

  1. 将代码保存为 bmi_web.go
  2. 在终端运行:
go run bmi_web.go
  1. 打开浏览器访问:http://localhost:8080

  2. 输入体重(kg)和身高(米),点击“计算 BMI”即可看到结果


三、总结对比

版本技术栈特点适用场景
GUI版Go + Fyne图形界面,桌面应用,跨平台普通用户本地使用,简单直观
Web版Go + net/http浏览器访问,服务端计算,支持多用户网页服务、部署到服务器供多人使用

如果你想进一步扩展功能,比如:

  • 保存计算历史记录(Web版可加数据库)
  • 支持输入厘米单位自动转米
  • 美化界面(CSS / Fyne 主题)
  • 多语言支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93810.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93810.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93810.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统优化命令-记录

闲着无聊&#xff0c;近来电脑有些卡顿&#xff0c;记录一下相关命令。最好的命令还是格式化╮(╯▽╰)╭ 1. 磁盘清理相关命令 cleanmgr - 磁盘清理工具 cleanmgr启动磁盘清理工具&#xff0c;可清理临时文件、回收站等内容 diskpart - 磁盘分区工具 diskpart用于磁盘管理&…

BFCP协议学习

BFCP是为了SIP呼叫中实现presentation的二进制协议。开源库libbfcp 如何协商角色 SIP 消息的SDP中有BFCP 的部分&#xff0c;其中s-only 代表要当服务器角色&#xff0c;c-only 代表要当client角色。confid, userid 都是需要在后续消息中对齐的。 通过port信息可以为后续bfcp…

常用设计模式系列(十七)—命令模式

常用设计模式系列&#xff08;十七&#xff09;—命令模式 第一节、前言 各位老铁好&#xff01; 今天我来跟大家分享对象行为型模式第二章节——《命令模式》&#xff0c;“命令”一词&#xff0c;通俗易懂&#xff0c;我们在生活中经常会发出各种各样的命令&#xff0c;就像你…

【AI绘画】Stable Diffusion 全面指南:安装、版本对比、功能解析与高级应用

引言&#xff1a;Stable Diffusion 概述 在人工智能图像生成领域&#xff0c;商业工具如Midjourney凭借其集成化服务与高质量输出占据市场&#xff0c;而Stable Diffusion&#xff08;简称SD&#xff09;则以开源特性构建了差异化优势。与商业工具依赖云端资源、受限于订阅费用…

kafka使用kraft

window 使用kafka-storage生成生成一个uuid .\kafka-storage.bat random-uuid格式化存储 在这里插入代码片.\kafka-storage.bat format -t 对应的uuid D:\configure\fisher\kafka\config\kraft\server.properties 启动命令 .\kafka-server-start.bat D:\configure\fisher\kafka…

HCIA-Datacom认证笔记:IP路由基础——核心概念与路由分类

网络技术学习中&#xff0c;IP路由是绕不开的核心知识点&#xff0c;对于备考HCIA-Datacom认证的朋友来说&#xff0c;掌握路由基础能为后续学习打下良好基础。今天带朋友们梳理一下IP路由的核心概念、路由表结构及路由分类一、路由核心概念什么是路由&#xff1f; 简单来说&am…

FFmpeg 安装与使用

文章目录1. 环境部署&#xff08;Windows&#xff09;1.1. 安装包下载1.2. 配置环境变量1.3. 验证安装2. FFmpeg 基础使用教程2.1. 常用命令格式2.2. 基础功能示例2.2.1. 视频转码&#xff08;MP4 → MKV&#xff09;2.2.2. 调整分辨率&#xff08;1080p → 480p&#xff09;2.…

Python 数据分析(四):Pandas 进阶

目录 1. 概述2. 缺失项3. 分组聚合4. 数据合并5. 数据可视化 5.1 折线图5.2 条形图5.3 直方图5.4 散点图5.5 饼图 1. 概述 我们在上一篇文章初识 Pandas中已经对 Pandas 作了一些基本介绍&#xff0c;本文我们进一步来学习 Pandas 的一些使用。 2. 缺失项 在现实中我们获…

结构化文本文档的内容抽取与版本重构策略

结构化文本文档的内容抽取与版本重构策略 摘要 本文深入探讨了结构化文本文档处理领域中的两大核心技术——内容抽取与版本重构。文章首先分析了结构化文档的特点及其在现代信息管理中的重要性&#xff0c;随后系统性地介绍了文档内容抽取的技术路线与方法论&#xff0c;包括…

【BUUCTF系列】[HCTF 2018]WarmUp1

本文仅用于技术研究&#xff0c;禁止用于非法用途。 Author:枷锁 点开题目显示一个图片&#xff0c;没有任何交互功能&#xff0c;我们直接查看网页源代码我们可以看到有一个歆慕的注释source.php&#xff0c;我们进行拼接&#xff0c;访问一下这个文件在url后加上/source.php进…

Flutter Chen Generator - IconFont Generator

Flutter Chen Generator &#x1f680; 一个强大的Flutter代码生成工具包&#xff0c;包含多个实用的代码生成器。 ✨ 功能特性 &#x1f4c1; 资源生成器 (Assets Generator) &#x1f504; 自动扫描assets目录并生成Dart常量&#x1f9e0; 智能驼峰命名转换&#xff0c;保…

【MATLAB】(二)基础知识

一.MATLAB命令1.指令行“头首”的 “>>” 是 “指令输入提示符” &#xff0c;它是自动输入的。“>>” 为运算提示符&#xff0c;表示MATLAB处于准备就绪状态。如在提示符后输入一条命令或一段程序后按Enter键&#xff0c;MATLAB将给出对应的结果&#xff0c;并将结…

Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零

文章链接 1049. 最后一块石头的重量 II 解题关键&#xff1a;找到重量和尽量相等的两堆 确定dp数组以及下标的含义 dp[j]表示容量&#xff08;这里说容量更形象&#xff0c;其实就是重量&#xff09;为j的背包&#xff0c;最多可以背最大重量为dp[j]。 确定递推公式 01背包…

【A*/BFS】P5507 机关

# P5507 机关 题目描述 这扇门上有一个机关&#xff0c;上面一共有12个旋钮&#xff0c;每个旋钮有4个状态&#xff0c;将旋钮的状态用数字111到444表示 每个旋钮只能向一个方向旋转&#xff08;状态&#xff1a;1->2->3->4->1&#xff09;&#xff0c;在旋转时&am…

终结集成乱局:模型上下文协议(MCP)如何重构AI工具生态?

AI 助手正处于能力发展的初级阶段。它们擅长处理独立任务——例如解析 PDF、编写 SQL 语句、等等——但当你要求它们在 Slack、Gmail 和 Jira 等平台间协同操作时&#xff0c;整个流程就变得异常复杂且脆弱&#xff0c;如同调试一套由众多 API 密钥串联的精密机械&#xff08;鲁…

谈谈毕业工作一年后的变化

文章目录谈谈毕业工作一年后的变化工作篇生活篇谈谈毕业工作一年后的变化 工作篇 2025.7.30 21:49 呼~再次打开这个网站发布文章&#xff0c;是多么陌生。仿佛有说不完的话&#xff0c;但如今时间却不允许我无限制的长篇大论的写下去了。 先说下工作吧。 毕业后工作好快啊&…

huggingface下载问题

国内使用git clone下载huggingfaceTOC 国内直接git clone连接不上问题 git clone https://huggingface.co/spaces/ZebangCheng/Emotion-LLaMA Cloning into ‘Emotion-LLaMA’… fatal: unable to access ‘https://huggingface.co/spaces/ZebangCheng/Emotion-LLaMA/’: Fai…

anaconda searchanaconda show | conda 检索包资源安装指定版本包指定源安装命令package

conda issuehttp://t.csdnimg.cn/ndZZK 目录 常规安装 检索包资源 获取指定包的安装源&安装指令 安装指定包 常规安装 conda 常规安装xxx包 conda install xxx conda install有可能会受限于channel导致报错PackagesNotFoundError: The following packages are not av…

python cli命令 cli工具命令 自定义cli命名 开发 兼容 window、mac、linux,调用示例

前言需求背景整个项目基于Python开发&#xff0c;需求方期望不直接调用Python脚本执行&#xff0c;希望封装为cli命令执行Python脚本&#xff0c;使其更为简单而又“优雅”。类似直接使用 adb devices 的方式直接调用运行&#xff0c;而不是 python adbToolls.py devices的方式…

k8s pod生命周期、初始化容器、钩子函数、容器探测、重启策略

pod结构Pause容器 Pause容器是每个Pod都会有的一个根容器&#xff0c;它的作用有两个 可以以它为根据&#xff0c;评估整个pod的健康状态可以在根容器上设置IP地址&#xff0c;其他容器都以此IP&#xff08;Pod IP&#xff09;&#xff0c;以实现Pod内部的网络通信&#xff0c;…