1. 2件のとき
  2. 1件のとき
  3. 3件のとき
コース一覧
Go入門
rangeで走査する

Go入門

変数とゼロ値、Go唯一のループであるfor、複数戻り値とエラー処理、スライスとマップ、構造体とメソッド、ゴルーチンによる並行処理、net/httpによるAPI開発まで、Goの基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIをGoで作りながら学びます。

1
Hello, Go
01. Goとは15分
02. 実行してみる15分
03. packageとmain15分
04. fmtで出力する15分
05. go buildと1バイナリ15分
06. つくる: 起動バナー20分
07. 第1章クイズ10分
2
変数と型
01. varで宣言する15分
02. := の短縮宣言15分
03. ゼロ値(Goならでは)15分
04. 基本の型15分
05. 暗黙変換なし15分
06. 定数とiota15分
07. つくる: 商品データ表示20分
08. 第2章クイズ10分
3
制御構文(forしかない世界)
01. Goのif15分
02. forしかない世界15分
03. forの七変化15分
04. Goのswitch15分
05. 定番: FizzBuzz15分
06. ループで集計15分
07. つくる: 商品集計20分
08. 第3章クイズ10分
4
関数とエラー処理
01. funcで関数を作る15分
02. 複数戻り値(Goならでは)15分
03. if err != nil(Goの心臓)15分
04. エラーを作る15分
05. deferで後始末15分
06. つくる: 検証つき関数群20分
07. 第4章クイズ10分
5
スライスとマップ
01. 配列15分
02. スライス15分
03. appendで育てる15分
04. rangeで走査する15分
05. マップ15分
06. カンマokイディオム15分
07. つくる: 検索と集計20分
08. 第5章クイズ10分
6
構造体とメソッド
01. 構造体15分
02. 初期化とフィールド15分
03. メソッド15分
04. ポインタレシーバ20分
05. New関数の慣習15分
06. 構造体のスライス15分
07. つくる: Itemで再設計20分
08. 第6章クイズ10分
7
ゴルーチンと並行処理のさわり
01. ゴルーチン15分
02. チャネル20分
03. 待ち合わせ20分
04. 並行の落とし穴20分
05. つくる: 並行集計20分
06. 第7章クイズ10分
8
Web API(net/http)
01. サーバーを立てる20分
02. ハンドラ関数20分
03. JSONを返す20分
04. ルーティング20分
05. 一覧API20分
06. 詳細APIと40420分
07. 出品API20分
08. つくる: API主要部完成25分
09. 第8章クイズ10分
9
総合制作
01. 仕様互換を仕上げる25分
02. Node版と差し替える25分
03. 1バイナリでデプロイ25分
04. 自由拡張25分
05. 完成と次のステップ20分

rangeで走査する

添字と値を同時に受け取る

Go

for i, price := range prices { fmt.Println(i, price) }

1つ目が添字、2つ目が値です。ここまで書いてきた形と比べます。

Go

for i := 0; i < len(prices); i++ { price := prices[i] } for i, price := range prices { // 同じこと }

短いだけではありません。範囲を超える書き間違いが起こりえません。 i <= len(prices) と書いて止まる事故が、この形なら発生しません。

実際の Go のコードでは、並びを回すときほぼ range を使います。

片方だけ要るとき

値だけでよいなら、添字を _ にします。

Go

for _, price := range prices { total += price }

添字だけでよいなら、値を書かずに済みます。

Go

for i := range prices { fmt.Println(i) }

2つ目を省略できるのは、要らないものを書かせないためです。_ すら書かなくてよくなります。

値はコピーである

ここが唯一の落とし穴です。range が渡してくるのは値のコピーです。

Go

for _, price := range prices { price = 0 // コピーを変えただけ } fmt.Println(prices) // 元のまま

書き換えたいなら、添字を使います。

Go

for i := range prices { prices[i] = 0 // これなら効く }

第6章で構造体を扱うようになると、この違いが効いてきます。「range で回して中身を書き換えたのに反映されない」は定番の詰まりどころです。

文字列にも使える

Go

for i, r := range "きのこ" { fmt.Println(i, string(r)) }

プレーンテキスト

0 き 3 の 6 こ

添字が 0・3・6 と飛んでいます。日本語の1文字が3バイトを使うためです。range は文字の単位で回してくれるので、日本語を1文字ずつ扱うときはこの形が安全です。

添字で s[0] のように取り出すと、バイト単位になって文字が壊れます。日本語を扱うときに覚えておく価値のある違いです。

要件

  1. for i, name := range names の形で回す
  2. 番号は1から始める
  3. N. 商品名 価格円 の形で1行ずつ並べる
  4. 行の区切りは \n。最後に余分な改行を付けない

入出力例

rangeList(["きのこ図鑑","中古スマホ"], [1200,24800]) → "1. きのこ図鑑 1200円 2. 中古スマホ 24800円" rangeList(["きのこ図鑑"], [1200]) → "1. きのこ図鑑 1200円" rangeList(["A","B","C"], [100,200,300]) → "1. A 100円 2. B 200円 3. C 300円"

ヒント

`for i, name := range names {` と書くと、添字と商品名を同時に受け取れます

価格は `prices[i]` で取り出します。2つの並びは同じ添字で対応しています

初期コードは末尾に改行が残る形です。行の後ろではなく前に `\n` を足すと直ります

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • マップ

    キーと値の組で持つマップを使い、カテゴリごとの件数を集計できるようになります。

  • カンマokイディオム

    キーの有無を2つ目の戻り値で判定し、無いキーを安全に扱えるようになります。

  • つくる: 検索と集計

    第5章の知識でキーワード検索とカテゴリ集計を同時に行えるようになります。

  • 第5章クイズ

    配列とスライスの違い、append、range、マップ、カンマokについての理解を確認します。

main.go
学習モード
エディタを読み込んでいます

メモ

rangeで走査する

⌘S で保存