1. 3件のとき
  2. 1件のとき
  3. 0が混ざるとき
  4. 同じ値が並ぶとき
コース一覧
Go入門
ゴルーチン

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分

ゴルーチン

go と書くだけ

Go

go doSomething()

関数呼び出しの前に go を付けます。これだけで、その処理は別の流れで走り始めます。呼んだ側は結果を待たずに次の行へ進みます。

この別の流れを ゴルーチン と呼びます。Go という名前がそのまま入っているとおり、この言語の看板機能です。

何がうれしいのか

待ち時間のある処理が並ぶと、順番に実行するのは無駄です。

プレーンテキスト

順番に 商品を数える(1秒) → 売上を数える(1秒) → 合計2秒 同時に 両方を同時に始める → 合計1秒

サーバーは、この「待っている時間」の塊です。データベースの応答待ち、外部APIの応答待ち。その間に別のリクエストを処理できれば、同じ機械でずっと多くを捌けます。Go がサーバー向きと言われるのは、これが1語で書けるからです。

いきなり困ること

Go

func main() { go fmt.Println("ゴルーチンから") fmt.Println("main から") }

プレーンテキスト

main から

ゴルーチンの出力が出ません。

main が終わると、プログラム全体が終わります。走り始めたゴルーチンは、途中でも打ち切られます。誰も待ってくれません。

順番が決まらない

Go

for i := 1; i <= 3; i++ { go fmt.Println(i) } time.Sleep(100 * time.Millisecond) // 終わるまで少し待つ

出力の順番は毎回変わります。1 2 3 のこともあれば、3 1 2 のこともあります。

最後の1行が無いと、何も出力されません。さきほどの話と同じで、main が 終わった時点で3つとも打ち切られるからです。ここでは順番を見せたいので time.Sleep で待っていますが、これは説明のための仮のやり方です。 本当の待ち合わせは次のレッスン以降で扱います。

どちらが先に終わるかは決まっていません。 これは不具合ではなく、並行処理の性質そのものです。順番が要るなら、それを保証する仕組みを別に用意します。

だから、この章の残りがある

ゴルーチンは始めるのが1語で済む代わりに、終わりを扱う道具が要ります。

プレーンテキスト

チャネル 結果を受け取る 次のレッスン WaitGroup 全部の完了を待つ その次 Mutex 同じ変数を守る その次の次

go と書くのは簡単で、正しく待つのが難しい。第7章はその難しさのほうを扱います。

このコースの演習では

採点は関数の戻り値で行うので、結果を必ず回収してから返す形になります。次のレッスン以降で、その書き方を身につけます。今回は「待たないと結果が消える」ことを、コードで確かめてもらいます。

要件

  1. 各要素を2倍にする処理をゴルーチンで走らせる
  2. 結果をチャネルで受け取る
  3. 要素数と同じ回数だけ取り出して合計する
  4. 要素が0件のときは 0 を返す

入出力例

runTasks([1,2,3]) → 12 runTasks([5]) → 10 runTasks([0,4]) → 8 runTasks([2,2,2]) → 12

ヒント

初期コードは走らせるところまでできています。取り出す処理が抜けています

`for i := 0; i < len(nums); i++ { total += <-ch }` で、入れた数だけ取り出します

取り出す回数が足りないと合計が合わず、多すぎると永久に待ってタイムアウトします

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

関連レッスン

  • チャネル

    チャネルで結果を安全に受け取り、並行処理の答えを回収できるようになります。

  • 待ち合わせ

    sync.WaitGroupで全ての処理の完了を待てるようになります。

  • 並行の落とし穴

    同じ変数を複数のゴルーチンが触ると壊れることを知り、Mutexで守れるようになります。

  • つくる: 並行集計

    第7章の知識でカテゴリ別の集計を並行に実行し、結果を安全にまとめられるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 関数処理に名前を付けて再利用できる単位
  • 処理計算や代入を表す長方形
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • データベースデータを構造化して保存する仕組み
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • 戻り値呼び出し元への返答を表す点線矢印
main.go
学習モード
エディタを読み込んでいます

メモ

ゴルーチン

⌘S で保存