forしかない世界
ループは1種類だけ
他の言語には、繰り返しの書き方がいくつもあります。
for / while / do-while / foreach / repeat-untilGo にあるのは for だけです。while も do-while もありません。
減らしたのは、書き方が増えるほど「どれを使うべきか」で迷い、読む人も切り替えが要るからです。1つに絞れば、繰り返しを見たときに必ず for を探せば済みます。
基本の形
Go
for i := 0; i < 3; i++ {
fmt.Println(i)
}セミコロンで区切られた3つの部分があります。
i := 0 最初に1回だけ実行する
i < 3 毎回ここを見て、真なら続ける
i++ 1周が終わるたびに実行する動く順番はこうなります。
i := 0 → 条件を見る → 中身 → i++ → 条件を見る → 中身 → i++ → ...条件が偽になった時点で、中身を実行せずに抜けます。
i++ は文であって式ではない
細かいところですが、Go の i++ は値を持ちません。
Go
j := i++ // エラー
fmt.Println(i++) // エラー他の言語では i++ が値を返すため、a[i++] のような書き方ができます。短く書ける一方で、増える前の値なのか後の値なのかが読み取りにくくなります。Go はその書き方をできなくしています。
-- も同じです。そして ++i という前置きの形はありません。
商品を順に処理する
Go
prices := []int{1200, 24800, 999}
for i := 0; i < len(prices); i++ {
fmt.Println(prices[i])
}len() は長さを返す組み込みの関数です。並びの最後まで回すときによく出てきます。
添字は 0 から始まるので、条件は i < len(...) です。i <= len(...) と書くと最後に1回はみ出して、実行時に止まります。
panic: runtime error: index out of range [3] with length 3panic は、実行中に続けられなくなったときに Go が出すものです。第5章の range を使うと、この間違いごと避けられます。
文字列に1行ずつ足す
+ は文字列をつなぐときにも使えます。空文字から始めて、今の文字列に次の行を足します。\n は改行です。
Go
result := ""
result = result + "りんご\n"
result = result + "みかん\n"演習では、番号と商品名から1行を作る numberedLine を用意しています。たとえば numberedLine(1, "りんご") は "1. りんご\n" を返します。補助関数は変更せず、ループの中でその1行を result に足してください。最後の行にも改行を付けるので、行ごとに条件を分ける必要はありません。
要件
for i := 0; i < len(names); i++ {の形で商品を順に処理する- 番号は1から始め、
numberedLineで作ったN. 商品名の行をresultに足す - 最後の行を含め、各行の最後に
\nを付ける - 商品が1件も無いときは空文字を返す