問2 errを無視するな
初段 / 目安 20分
凛さんが次の依頼を持ってきました。
「価格の文字列を数値に変換する処理、書いてください。……先に言っておきます。戻り値の err を _ で捨てたコードは、その場でリジェクトします」
Go の関数は、値を2つ返せます。この仕組みがいちばん効いてくるのが、失敗しうる処理です。
Go
n, err := strconv.Atoi("4800")左が結果、右がエラーです。成功していれば err は nil になり、失敗していれば理由の入った値が返ります。返ってきた err を見るまで、結果を信じてはいけません。
ここで手を抜くと何が起きるか、実際に見ておいてください。strconv.Atoi("たぶん5000") は失敗しますが、そのとき1つ目の戻り値は 0 です。err を _ で捨てると、変換できなかったことに気付かないまま 0 を掴みます。fleama なら、0円の商品が出品されることになります。
ですから書き方は必ずこの形になります。
Go
n, err := strconv.Atoi(s)
if err != nil {
// 失敗したときにどうするかを、自分で決める
}凛さんが「捨てるな」と言うのは、行儀の話ではありません。捨てると嘘の値が下流へ流れるからです。
完成条件
価格の文字列を受け取り、表示用の1行を返す関数 parsePrice を作ってください。
変換できたときは 4800円 の形で返します。変換できなかったときは 価格が読めません を返してください。
変換できたとしても、0 以下だったときは 価格は1円以上です を返します。
err を捨てた実装では、不正な文字列のときに 0円 を返してしまい、テストが通りません。
要件
strconv.Atoiの戻り値を値, errの2つで受け取り、errを確かめる- 変換できなければ
価格が読めませんを返す - 変換できても
0以下なら価格は1円以上です、そうでなければ<数値>円を返す
入出力例
parsePrice("4800") → "4800円"
parsePrice("たぶん5000") → "価格が読めません"
parsePrice("") → "価格が読めません"
parsePrice("0") → "価格は1円以上です"
parsePrice("-100") → "価格は1円以上です"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部