コース一覧
    Go基礎:データ構造
    スライス

    Go基礎:データ構造

    Goのスライス、マップ、構造体、メソッドを使ったデータ表現を学ぶコースです。

    1
    スライスとマップ
    01. 配列15分
    02. スライス15分
    03. appendで育てる15分
    04. rangeで走査する15分
    05. マップ15分
    06. カンマokイディオム15分
    07. つくる: 検索と集計20分
    08. 第5章クイズ10分
    2
    構造体とメソッド
    01. 構造体15分
    02. 初期化とフィールド15分
    03. メソッド15分
    04. ポインタレシーバ20分
    05. New関数の慣習15分
    06. 構造体のスライス15分
    07. つくる: Itemで再設計20分
    08. 第6章クイズ10分

    スライス

    角括弧に数を書かない

    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] を使う

    ヒント

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

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

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

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

    関連レッスン

    • appendで育てる

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

    • rangeで走査する

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

    • マップ

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

    • カンマokイディオム

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

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

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

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

    メモ

    スライス

    ⌘S で保存