Go言語デビュー

f:id:tabascolabo:20201228125715j:plain
サーバーサイドの勉強がしたくてGo言語をやってみようかなと思った。
試しにどんなもんかとGo言語で遊んでいたらGUIが作りたくなったので
BMI計算機を作った。
lxn/walkというGUIを作るライブラリ(Go言語風に言うとパッケージ)を使用したが
情報が少なく地味に面倒だった。
困った時にググっても何も見つからなかったらRedditで聞くという
潔く誰かに助けを請う戦法が必要だと思われる。
あとGoという普遍的な英単語が名前につけられているのもよくない。
全く関係ないウェブサイトがヒットしまくる。
Walkについてもそう。作成者はそこら辺のことを考慮しないアホなのか。
RXMNA言語みたいな絶対他の単語と被らない名前をつけてほしい。

コマンドプロンプトにおける基本的なコマンド
go get - パッケージをインストール
go run - 実行
go build - exeファイルを作る

exeを起動する場合には同じ場所にマニフェストファイルがないといけない。
name.exe.manifestという感じで名前をつけておく
中身は書き換える必要ない

以下マニフェストファイル

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
        <dependency>
            <dependentAssembly>
                <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
            </dependentAssembly>
        </dependency>
    </assembly>

以下BMI計算機

package main

import (
	"strconv"
    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
)

func main() {
	var heightTE, weightTE *walk.LineEdit
	var outTE *walk.LineEdit
	var BMI float64
	var BMIre string
	var josuu float64
	var komento string


	MainWindow{
		Title:   "BMI計算機",
		MinSize: Size{150, 150},
		Size : Size{250,250},
		Layout:  VBox{},
		Children: []Widget{
			Label{Text: "身長(cm)"},
			LineEdit{AssignTo: &heightTE},
			Label{Text: "体重(kg)"},
			LineEdit{AssignTo: &weightTE},
			Label{Text: "BMI"},
			LineEdit{AssignTo: &outTE, ReadOnly: true},
			PushButton{
			    Text: "BMI計算",
				OnClicked: func() {
				   hm, err := strconv.ParseFloat(heightTE.Text(), 64)
				   if err != nil {
				   }
				   
				   hm = hm*0.01
				   
				   weight, err := strconv.ParseFloat(weightTE.Text(), 64)
                   if err != nil {
                   }
				   
				   josuu = hm*hm
                   BMI = weight/josuu			   
				   BMIre = strconv.FormatFloat(BMI, 'f', 2,64)
				   if BMI<=17.0 {komento="痩せています。"
				   } else if 17.0 < BMI && BMI < 18.5 {komento="やや痩せています。"
				   } else if 18.5 <= BMI && BMI <= 25.0 {komento="普通体型です。"
				   } else if 25.0 < BMI && BMI < 30.0 {komento="やや肥満です。"
				   } else {komento="肥満です。"
				   }
				   

				   outTE.SetText("あなたのBMIは、"+BMIre+"です。"+komento)
				},
			},
		},
	}.Run()
}

パッケージ使うときはエラー処理
err := strconv.ParseFloat(heightTE.Text(), 64)
if err != nil {
}

の部分を書かないと
「返り値を2つ返したい」というエラーが出ることに注意。


クソデカ入力欄が作りたければTextEditを使う。
今回は一行だけの入力欄でよかったのでLineEditを使った。