Go Academy · レッスン

スライス:動的なリスト

make、append、copy、len、cap

レッスン 2/413 ステップ

「スライス:動的なリスト」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

スライスとは

スライスは、基になる配列を動的なサイズで参照するビューです。配列へのポインター、長さ、容量という3つの要素で構成されます。

  • スライスは参照型で、複数のスライスが同じバッキング配列を共有できます
  • Go でリストに似た処理を行う場合は、配列ではなくスライスを使用するのが一般的です

スライスリテラルと make

リテラルまたは make を使ってスライスを作成します。

package main
import "fmt"

func main() {
    nums := []int{1, 2, 3, 4, 5}      // literal
    strs := make([]string, 3)          // len=3, cap=3, zero values
    buf  := make([]byte, 0, 64)        // len=0, cap=64
    fmt.Println(nums, strs, len(buf), cap(buf))
}

len と cap

len は、スライスに現在含まれている要素数を返します。cap は、スライスの開始ポインターから基になる配列の容量を返します。

package main
import "fmt"

func main() {
    s := make([]int, 3, 8)
    fmt.Println(len(s)) // 3
    fmt.Println(cap(s)) // 8
}

append:スライスを拡張する

append はスライスに要素を追加し、容量を超えた場合は新しいバッキング配列を割り当てます。

package main
import "fmt"

func main() {
    s := []int{1, 2, 3}
    s = append(s, 4, 5)
    s = append(s, []int{6, 7, 8}...)
    fmt.Println(s) // [1 2 3 4 5 6 7 8]
}

スライスの切り出し

[low:high] 構文を使用してサブスライスを作成します(バッキング配列を共有します)。

package main
import "fmt"

func main() {
    a := []int{0, 1, 2, 3, 4, 5}
    b := a[1:4]   // [1 2 3]
    c := a[:3]    // [0 1 2]
    d := a[3:]    // [3 4 5]
    fmt.Println(b, c, d)
}

copy:独立したスライス

copy はスライス間で要素をコピーし、コピーした要素数を返します。コピー先とコピー元はメモリを共有しません。

package main
import "fmt"

func main() {
    src := []int{1, 2, 3}
    dst := make([]int, len(src))
    n := copy(dst, src)
    dst[0] = 99
    fmt.Println(src, dst, n) // [1 2 3] [99 2 3] 3
}

nil スライスと空のスライス

nil スライスにはバッキング配列がありません。空のスライスにはバッキング配列がありますが、長さは0です。どちらも len == 0 になります。

package main
import "fmt"

func main() {
    var nilSlice []int
    emptySlice  := []int{}
    fmt.Println(nilSlice  == nil) // true
    fmt.Println(emptySlice == nil) // false
    fmt.Println(len(nilSlice), len(emptySlice)) // 0 0
    nilSlice = append(nilSlice, 1) // safe!
}

要素の削除

Go にはスライス用の組み込み delete はありません。慣用的な方法では append を使用します。

package main
import "fmt"

func main() {
    s := []int{1, 2, 3, 4, 5}
    i := 2 // delete index 2
    s = append(s[:i], s[i+1:]...)
    fmt.Println(s) // [1 2 4 5]
}

要素の挿入

append とスライス操作を組み合わせると、位置 i に要素を挿入できます。

package main
import "fmt"

func main() {
    s := []int{1, 2, 4, 5}
    i := 2
    s = append(s[:i+1], s[i:]...)
    s[i] = 3
    fmt.Println(s) // [1 2 3 4 5]
}

スライスの注意点:共有されるバッキング配列

サブスライスはバッキング配列を共有するため、再割り当てが発生するまでは、一方を変更するともう一方にも影響します。

package main
import "fmt"

func main() {
    a := []int{1, 2, 3, 4}
    b := a[:2]   // shares backing array
    b[0] = 99
    fmt.Println(a) // [99 2 3 4] — a is changed!
}

簡単な確認

append は何を返しますか。

まとめ:スライス

主なポイントは次のとおりです。

  • スライスはポインター、len、cap で構成され、配列をラップします
  • make を使って容量を事前に割り当てます
  • append の結果は必ず代入してください
  • copy は独立したスライスを作成します
  • サブスライスではバッキング配列が共有されることに注意してください

練習課題

make を使って int のスライスを5個分作成し、さらに3つの値を追加してから、新しいスライスにコピーしてください。元のスライスに影響を与えずにコピーを変更し、両方を出力してください。

無料で開始

AI チューターと学ぶ Go — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「スライス:動的なリスト」レッスンは無料ですか?

はい。「スライス:動的なリスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「スライス:動的なリスト」で何を学びますか?

make、append、copy、len、cap ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「スライス:動的なリスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 配列:固定長のコレクション
  2. スライス:動的なリスト
  3. マップ:キーと値のストア
  4. rangeによるコレクションの反復
← Go Academyに戻る