1. 5件あるとき先頭3件
  2. ちょうど3件
  3. 2件しかないとき
  4. 1件のとき
コース一覧
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

var prices []int // スライス var prices [3]int // 配列

見た目の違いは数字の有無だけですが、性質はまるで違います。

プレーンテキスト

配列 長さが型の一部。渡すとコピーされる スライス 長さは型に含まれない。渡してもコピーされない

実際の Go のコードで並びを扱うときは、ほぼ全部スライスです。

作り方

Go

prices := []int{1200, 24800, 999} // 値から作る prices := make([]int, 3) // 長さ3で作る。中身はゼロ値 var prices []int // 空。ゼロ値は nil

3つ目に注意してください。スライスのゼロ値は nil です。ただし nil のスライスにも len() は使えて、0 を返します。

Go

var prices []int len(prices) // 0。panic にはならない

空のスライスとして普通に扱えるので、nil かどうかを気にせず for で回せます。

中身は共有される

スライスの正体は、どこかにある配列を指す情報です。実際のデータは別の場所にあり、スライス自身は「どこから、いくつ分か」を持っているだけです。

そのため、渡しても中身はコピーされません。

Go

func discount(p []int) { p[0] = 0 } prices := []int{1200, 24800} discount(prices) fmt.Println(prices[0]) // 0。書き換わっている

配列のときと結果が逆になります。渡した先で書き換えられるということです。

速いぶん、意図しない書き換えが起こりえます。関数に渡すときは、その関数が中身を変えるのかどうかを意識してください。

一部を切り出す

Go

prices := []int{1200, 24800, 999, 500} prices[1:3] // [24800, 999] prices[:2] // [1200, 24800] prices[2:] // [999, 500]

[開始:終了] で切り出せます。開始は含み、終了は含みません。 [1:3] は添字 1 と 2 の2つです。

この範囲の書き方は、for i := 0; i < len(prices); i++ と同じ考え方です。終わりを含まないので、len をそのまま終了位置に書けます。

切り出したものは元と同じ場所を指しています。片方を書き換えると、もう片方にも影響します。ここは入門の範囲を超えるので、いまは「切り出してもコピーではない」とだけ覚えておいてください。

要件

  1. 先頭3件までを集計する
  2. 3件に満たないときは、あるだけを集計する
  3. 先頭N件 合計M円 の形を返す
  4. スライスの切り出し prices[:n] を使う

入出力例

topThree([1200,24800,999,500,300]) → "先頭3件 合計26999円" topThree([1000,2000,3000]) → "先頭3件 合計6000円" topThree([1200,999]) → "先頭2件 合計2199円" topThree([1200]) → "先頭1件 合計1200円"

ヒント

切り出す数を先に決めます。`n := len(prices)` として、3より大きければ 3 に直します

`prices[:n]` で先頭 n 件を切り出せます。n が長さを超えていると実行時に止まります

切り出したものも普通のスライスなので、`len` と添字がそのまま使えます

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

関連レッスン

  • appendで育てる

    appendで要素を追加し、新しい出品を一覧に足せるようになります。

  • rangeで走査する

    for rangeで添字と値を同時に受け取り、一覧を番号つきで表示できるようになります。

  • マップ

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

  • カンマokイディオム

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

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

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

  • スライス範囲指定で部分列を取り出す記法
  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
main.go
学習モード
エディタを読み込んでいます

メモ

スライス

⌘S で保存