【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.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;…