当前位置: 首页 > news >正文

【go】实现BMI计算小程序与GUI/WEB端实现

好的,下面是用 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.dtcms.com/a/305633.html

相关文章:

  • 如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端
  • 华为昇腾×绿算全闪存缓存释放澎湃潜能
  • 如何使用 Conda 安装 Qiskit(详细教程)
  • android 性能优化
  • GitHub使用小记——本地推送、外部拉取和分支重命名
  • 外网访问文档编辑器Docsify(Windows版本),内网穿透技术应用简便方法
  • UnityHub Validation Failed下载编辑器错误,添加模块报错的解决方案
  • 【深度学习新浪潮】3D城市建筑多样化生产的研发进展调研
  • XTOM蓝光三维扫描仪:解锁中小尺寸复杂零件的高精度3D检测新境界
  • 基于 Amazon Bedrock 与 Anthropic Claude 3 智能文档处理方案:从扫描件提取到数据入库全流程实践
  • sqli-labs:Less-1关卡详细解析
  • 移动管家手机控车系统硬件安装与软件绑定设置
  • 轻松打造Unity小游戏AR体验
  • 5,Docker运行最新ultralytics-main教程
  • 解析非法获取计算机信息系统数据罪中的其他技术手段
  • 如何在出售Windows11/10/8/7前彻底清除电脑数据
  • 破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践录
  • Cockpit管理服务器
  • 通达OA服务器无公网IP网络,如何通过内网穿透实现外网远程办公访问OA系统
  • 记录Linux下ping外网失败的问题
  • Docker学习其一
  • 【机器学习】pycharm使用SSH SFTP 远程连接 ubuntu服务器 进行开发+调试+数据训练
  • 在VS2022中调试ASP.NET项目时修改DLL或ASPX动态页面的原理及实现方法
  • 【推荐100个unity插件】Unity 创意编程库——Klak插件的使用
  • 计算机网络基础(二) --- TCP/IP网络结构(应用层)
  • 论文Review LSLAM BALM | 经典激光SLAM方案!港大MARS出品!RAL2021 | 激光BA优化
  • DIV 指令概述
  • AWS VPC NAT 网关可观测最佳实践
  • 【iOS】weak修饰符
  • 计算机组成原理(6) - 加法器