好的,下面是用 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 主題)
- 多語言支持