forループは、同じ処理を繰り返し実行するためによく使われる文の1つです。Goでは、forキーワード、ヘッダー、そして波括弧で囲まれたループ本体を含むブロックからできています。ヘッダーは、セミコロン;で区切られた3つの要素、init・condition・postからなります。
for init; condition; post {
// loop body - code that is executed repeatedly as long as the condition is true
}
trueと評価されるかぎり実行されます。この式がfalseと評価された時点で、ループはそれ以上繰り返されません。注意: ほかの言語とは違い、ヘッダーの3つの要素を囲む括弧(())はありません。むしろ、このような括弧を書くとコンパイルエラーになります。ただし、ループ本体を囲む波括弧({ })は常に必要です。
forループの例ふつう、initではカウンター変数を用意し、conditionではループを続けるか止めるかを判定し、postでは繰り返しのたびに最後にカウンターをインクリメントします。
for i := 1; i < 10; i++ {
fmt.Println(i)
}
このループは1から9までの数値(9も含む)を出力します。ステップの指定は、上の例のように、インクリメントやデクリメントの文で行うことが多いです。
庭に何羽の鳥が訪れたかを記録するのが日課の、熱心なバードウォッチャーです。 ふだんはノートに正の字を書いて鳥を数えていますが、データを扱いやすくするために、ここ数週間の鳥の数をデジタル化しました。
まずは全体像をつかむことから、データの分析を始めましょう。 記録を始めてから数えた鳥の合計を求めてください。
1日ごとの鳥の数を含むintのスライスを受け取る関数TotalBirdCountを実装します。
この関数は、数えた鳥の合計を返す必要があります。
birdsPerDay := []int{2, 5, 0, 7, 4, 1, 3, 0, 2, 5, 0, 1, 3, 1}
TotalBirdCount(birdsPerDay)
// => 34
鳥の数の全体像がつかめたので、次はより細かい分析をしてみたくなります。
1日ごとの鳥の数のスライスと週番号を受け取る関数BirdsInWeekを実装します。
この関数は、その週に数えた鳥の合計を返します。 週は常に完全に記録されているものとします。
birdsPerDay := []int{2, 5, 0, 7, 4, 1, 3, 0, 2, 5, 0, 1, 3, 1}
BirdsInWeek(birdsPerDay, 2)
// => 12
鳥を記録している間ずっと、庭の遠くの隅に隠れている鳥が1羽いたことに気づきました。
この鳥は、1日おきにいつも庭で過ごしていたことがわかりました。
その間の日にどこにいたのかは正確にはわかりませんが、庭にいなかったことは確かです。
バードウォッチャーとしての勘で、リストで記録を始めた最初の日には、この鳥が庭にいたこともわかっています。
この新しい情報をもとに、1日ごとに数えた鳥のスライスを引数として受け取り、数え間違いを修正したスライスを返す関数FixBirdCountLogを書いてください。
birdsPerDay := []int{2, 5, 0, 7, 4, 1}
FixBirdCountLog(birdsPerDay)
// => [3 5 1 7 5 1]