【go】实现BMI计算小程序与GUI/WEB端实现
好的,下面是用 Go 语言实现的一个简单的 BMI(Body Mass Index,身体质量指数)计算器,包含中文注释与完整代码,可以直接运行。
一、BMI 计算公式
BMI=体重(kg)身高2(m2)\text{BMI} = \frac{\text{体重(kg)}}{\text{身高}^2(m^2)} BMI=身高2(m2)体重(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
您的体重状态:正常
好的,下面分别给出:
- 带图形界面(GUI)的 BMI 计算器 —— 使用 Go 的 GUI 库
fyne
实现 - 带 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 版
- 将代码保存为
bmi_web.go
- 在终端运行:
go run bmi_web.go
-
打开浏览器访问:http://localhost:8080
-
输入体重(kg)和身高(米),点击“计算 BMI”即可看到结果
三、总结对比
版本 | 技术栈 | 特点 | 适用场景 |
---|---|---|---|
GUI版 | Go + Fyne | 图形界面,桌面应用,跨平台 | 普通用户本地使用,简单直观 |
Web版 | Go + net/http | 浏览器访问,服务端计算,支持多用户 | 网页服务、部署到服务器供多人使用 |
✅ 如果你想进一步扩展功能,比如:
- 保存计算历史记录(Web版可加数据库)
- 支持输入厘米单位自动转米
- 美化界面(CSS / Fyne 主题)
- 多语言支持