当前位置: 首页 > 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.lryc.cn/news/604429.html

相关文章:

  • python案例分析:基于抖音评论的文本分析,使用svm算法进行情感分析以及LDA主题分析,准确率接近90%
  • 相亲小程序聊天与互动系统模块搭建
  • 鹏哥C语言_82_指针_指针数组
  • 构建智能体(Agent)时如何有效管理其上下文
  • 大语言模型(LLM)技术架构与工程实践:从原理到部署
  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(二)
  • 【Lua】元表常用属性
  • PCB学习笔记(一)
  • 【Python系列】如何安装无 GIL 的 Python 3.13
  • dify 添加 ollama 模型报错
  • AP-0316 全功能语音处理模组:技术解析与应用指南
  • MySQL的单行函数:
  • 【C++】适配器模式手搓STL的stack和queue
  • 字节跳动GR-3:可泛化、支持长序列复杂操作任务的机器人操作大模型(技术报告解读)
  • 探索 Linux 权限的奥秘:守护系统安全的关键
  • C++11 std::function 详解:通用多态函数包装器
  • Thales靶机攻略
  • 二叉树算法之【二叉树的层序遍历】
  • 关于mysql时间类型和java model的日期类型映射
  • “古法编程”到“vibe coding”的第一步:Zread助力一键生成项目说明书
  • 本地 docker 部署 HAR包分析工具 harviewer
  • 云原生环境里的显示变革:Docker虚拟浏览器与cpolar穿透技术实战
  • Web前端实战:Vue工程化+ElementPlus
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——8. AI赋能(下):在Qt中部署YOLOv8模型
  • 【CF】Day115——杂题 (构造 | 区间DP | 思维 + 贪心 | 图论 + 博弈论 | 构造 + 位运算 | 贪心 + 构造 | 计数DP)
  • 从0到1学PHP(七):PHP 与 HTML 表单:实现数据交互
  • useRouteLeaveConfirm 路由离开确认弹窗 Hook
  • ECCV | 2024 | LocalMamba:具有窗口选择性扫描的视觉状态空间模型
  • 2019 年 NOI 最后一题题解
  • C语言数据结构(1)顺序表专题2.顺序表的应用