1. 4件を半分ずつ
  2. 奇数件
  3. 1件のとき
  4. 0が混ざるとき
コース一覧
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

ch := make(chan int) // int を流すチャネル ch <- 42 // 入れる v := <-ch // 取り出す

矢印が向きを表します。ch <- はチャネルへ入れる、<-ch はチャネルから取り出す、です。矢印はいつも値の流れる向きを指しています。

待ち合わせの道具でもある

チャネルの本当の役目は、値を運ぶことだけではありません。タイミングを合わせることです。

Go

v := <-ch

この行は、値が入るまでそこで止まります。入った瞬間に動き出します。

前のレッスンで「待たないと結果が消える」問題がありました。チャネルから取り出す行を書けば、そこで待つので消えません。

容量のあるチャネル

Go

ch := make(chan int) // 容量0 ch := make(chan int, 3) // 容量3

容量0のチャネルは、入れる側も取り出す側が来るまで待ちます。手渡しに近い動きです。

Go

ch := make(chan int) ch <- 42 // 取り出す人がいないと、ここで永久に止まる

1人で書いていると、これで固まります。

プレーンテキスト

fatal error: all goroutines are asleep - deadlock!

デッドロックです。全員が誰かを待っていて、誰も進めない状態を Go が検出して教えてくれます。

容量があれば、その数までは待たずに入れられます。

Go

ch := make(chan int, 3) ch <- 1 // 待たない ch <- 2 // 待たない

前のレッスンで make(chan int, len(nums)) としたのは、これが理由です。全部入れきってから取り出せるので、順番を気にせずに済みます。

取り出す回数を合わせる

最も間違えやすいのがここです。

プレーンテキスト

入れた数 > 取り出す数 結果が足りない 入れた数 < 取り出す数 永久に待つ。タイムアウト

入れた数をきっちり数えて、同じ回数だけ取り出します。この「数を合わせる」作業が面倒なので、次のレッスンの WaitGroup が用意されています。

range で受け取る

Go

for v := range ch { total += v }

チャネルが閉じられるまで受け取り続けます。閉じるのは送る側です。

Go

close(ch)

閉じ忘れると、range は永久に待ちます。入門のうちは回数を数えて取り出す形で十分なので、close は「そういうものがある」と知っておく程度で構いません。

要件

  1. 前半と後半をそれぞれゴルーチンで集計する
  2. 結果をチャネルで受け取る
  3. 2つの結果を足して返す
  4. 0件のときは 0 を返す

入出力例

parallelSum([100,200,300,400]) → 1000 parallelSum([100,200,300]) → 600 parallelSum([500]) → 500 parallelSum([0,0,100]) → 100

ヒント

初期コードには前半のゴルーチンだけがあります。後半のゴルーチンを足してください

後半は `prices[mid:]` です。切り出しの終わりを省くと最後までになります

取り出しは `<-ch + <-ch` と書けます。2つ入れたので2回取り出します

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

関連レッスン

  • 待ち合わせ

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

  • 並行の落とし穴

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

  • つくる: 並行集計

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

  • 第7章クイズ

    ゴルーチン、チャネル、WaitGroup、データ競合についての理解を確認します。

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

メモ

チャネル

⌘S で保存