Goの勉強 肥満度判定BMI計算をしてみよう 改造編 ~if文を使ってエラー判定してみよう~
こんばんわ。たかしです。
前回、標準入力から身長・体重を取り込んでそこからBMIを求めました。
今回は、数値を入力してほしいのに文字とかを入力された場合のエラー判定を入れてみます。
前回の記事はこちらです。
エラー判定してみよう!
さあ、前回のソース。数値以外を入力するとどうなるかというと
$ ./bmi
身長を入力してください:a
体重を入力してください:78
BMI = +Inf, 適正体重 = 0.000000, 肥満度 = +Inf
うーむ。やはり変な出力になってしまいますね。
エラー反映入れないと、求めたいことが求められないので、早速エラー判定入れてみましょう。
まずは、使用している「fmt.Scan」について
func Scan(a ...interface{}) (n int, err os.Error)
なるほど、読み込んだ結果を、nというint型の数値とerrというエラー型で返してくれるようだ。
つまり、入力値がおかしければ、「errの中に何かしら設定される=nilじゃなくなる」ということ。
それをif文で拾ってあげれば良い。
身長を例にするとこうなる。
// 身長を入力
fmt.Printf("身長を入力してください:")
n, err := fmt.Scan(&height)
// エラー判定
if err != nil {
fmt.Println(err)
}
「fmt.Println」にerrを入れてあげると、エラーの内容を表示してくれるようだ。
身長・体重それぞれにエラー処理を入れるとこうなる。
// 身長を入力
fmt.Printf("身長を入力してください:")
_, err1 := fmt.Scan(&height)
// エラー判定
if err1 != nil {
fmt.Println(err1)
}
// 体重を入力
fmt.Printf("体重を入力してください:")
_, err2 := fmt.Scan(&weight)
// エラー判定
if err2 != nil {
fmt.Println(err2)
}
一つずつ説明していくと
_, err1 := fmt.Scan(&height)
_, err2 := fmt.Scan(&weight)
何故、「n, err」ではなく「_, err」にしたかというと、今回「err」の結果を出力したいだけで「n」は使用しないようにしました。そうするとコンパイルしたときこんなこと言われました。
# command-line-arguments
./bmi2.go:18:2: n declared and not used
そう。「nを宣言しておいて使ってないぞハゲ」と怒られたわけです。
その対策として、「n, err」ではなく「_, err」として「n」に入れる値を捨てました。
そして、「err1」「err2」にした理由は、「_, err」にしたらこう言われたからです。
# command-line-arguments
./bmi2.go:26:9: no new variables on left side of :=
つまり、「体重の入力判定に使っているerrって変数が新しくないぞチョビヒゲ」と怒られたわけです。
errという値を使いまわすことはできないようなので、「err1」「err2」としました。
さて、完成したファイルをコンパイルして実行してみましょう。
$ go build bmi2.go
$ ./bmi2
身長を入力してください:a
strconv.ParseFloat: parsing "": invalid syntax
体重を入力してください:b
strconv.ParseFloat: parsing "": invalid syntax
BMI = NaN, 適正体重 = 0.000000, 肥満度 = NaN
うん。見事にエラーを判定していますね。大成功!
ここまで来たら何をしたいかというと、「身長・体重それぞれにちゃんと正しい値が入力されたらBMIなどを計算させる」というふうにしたいですよね。
というわけで!次回は「for文を使ってエラー判定してみよう」編になります。
今回は、if文を使ってみよう編でした。
またお会いしましょう。