Go練習問題2-08:スライスとキャパシティを理解しよう

記事内に商品プロモーションを含む場合があります

Go言語の初心者向け問題2-8:スライスとキャパシティを理解しよう

この問題を解くために必要な知識:
レベル1の知識論理演算子と代入演算子条件分岐(if-else文)条件分岐(switch文)ループ処理(for文)ラベルとgoto文無限ループ配列スライスとキャパシティ整列と検索マップループ処理(range文)サードパーティパッケージ

<<前の問題 問題集Top 次の問題>>

Go言語の文法「スライスとキャパシティ」とは





ここではスライスとキャパシティの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

スライスとは?

Go言語のスライスは、配列と似ていますが、柔軟なサイズを持つデータ構造です。スライスは、配列の一部を参照することができ、スライス自身のサイズを変更することができます。

スライスの背後には、元となる配列があり、その配列の一部を参照するのがスライスです。

スライスの定義と操作

スライスは次のように定義されます。

s := []int{1, 2, 3} // スライスの定義

スライスの要素を追加するには、append関数を使用します。

s = append(s, 4) // スライスに要素を追加

スライスのキャパシティ管理

スライスの長さは len で取得でき、キャパシティは cap で取得できます。キャパシティとは、スライスが内部的に保持する配列の最大容量です。

新しい要素を追加するたびに、必要であれば、スライスは内部の配列を再割り当てし、キャパシティを拡張します。

s := make([]int, 5, 10) // 長さ5、キャパシティ10のスライスを作成
fmt.Println(len(s)) // 出力: 5
fmt.Println(cap(s)) // 出力: 10

まとめ

スライスはGo言語で非常に重要なデータ構造であり、動的な配列として扱えます。配列の固定長に比べ、柔軟に使える点が特徴です。

スライスとキャパシティの概念を理解することで、効率的にメモリを管理し、プログラムのパフォーマンスを向上させることができます。 ​

Go練習問題2-8:スライスの動的な要素追加とキャパシティ管理

Go言語のスライスは動的に要素を追加でき、キャパシティが必要に応じて自動的に拡張されます。

次のコードを完成させて、スライスの要素を追加しながら、その長さとキャパシティがどのように変化するかを観察してください。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • スライスmake([]int, 3, 5)を作成し、3つの初期値を代入してください。
  • appendを用いて、スライスに新しい要素を追加してください。
  • スライスの長さとキャパシティを出力する処理を行ってください。
  • さらに要素を追加し、キャパシティが増加することを確認してください。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

スライスの長さ: 3
スライスのキャパシティ: 5
スライスの内容: [10 20 30 40 50]
スライスの長さ: 5
スライスのキャパシティ: 5
要素を追加後のスライスの内容: [10 20 30 40 50 60]
追加後のスライスの長さ: 6
追加後のスライスのキャパシティ: 10

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.import "fmt" による標準ライブラリのインポート

2.main 関数の定義
 2-1. スライス s の作成と初期化
  2-1-1. make([]int, 3, 5) を使用して、長さ3、キャパシティ5のスライスを作成
  2-1-2. スライス s に初期値を設定
 2-2. スライスの長さとキャパシティを表示
  2-2-1. fmt.Println でスライスの長さを表示
  2-2-2. fmt.Println でスライスのキャパシティを表示
 2-3. スライスへの要素追加処理
  2-3-1. append 関数を使用してスライスに要素を追加
 2-4. スライスの内容と再度の長さおよびキャパシティの表示
  2-4-1. fmt.Println でスライスの内容を表示
  2-4-2. fmt.Println でスライスの長さを再表示
  2-4-3. fmt.Println でスライスのキャパシティを再表示
 2-5. スライスのキャパシティが増加する様子の確認
  2-5-1. append で要素を追加してキャパシティを確認
  2-5-2. fmt.Println でキャパシティの増加を表示

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import "fmt"

// メイン関数:プログラムの開始点
func main() {
    // スライスを作成します。初期容量は3で、3つの要素を持つスライスを定義します。
    s := make([]int, 3, 5)

    // スライスの初期値を設定します。
    /*【穴埋め問題1】ここにスライスの初期値(10, 20, 30)を設定するコードを書いてください。*/
    
    // スライスの現在の長さとキャパシティを表示します。
    /*【穴埋め問題2】ここにスライスの長さとキャパシティを表示するコードを書いてください。*/

    // スライスに新しい要素を追加します。
    /*【穴埋め問題3】ここにスライスに新しい要素(40, 50)を追加するコードを書いてください。*/

    // スライスの要素を表示します。
    /*【穴埋め問題4】ここにスライスの要素を表示するコードを書いてください。*/

    // スライスの現在の長さとキャパシティを再表示します。
    /*【穴埋め問題5】ここにスライスの長さとキャパシティを再表示するコードを書いてください。*/

    // さらに要素を追加し、キャパシティが増加する様子を確認します。
    /*【穴埋め問題6】ここにスライスにさらに要素(60)を追加し、結果を表示するコードを書いてください。*/
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import "fmt"

// メイン関数:プログラムの開始点
func main() {
    // スライスを作成します。初期容量は3で、3つの要素を持つスライスを定義します。
    s := make([]int, 3, 5)

    // スライスの初期値を設定します。
    s[ 0] = 10
    s[ 1] = 20
    s[ 2] = 30

    // スライスの現在の長さとキャパシティを表示します。
    fmt.Println("スライスの長さ:", len(s))
    fmt.Println("スライスのキャパシティ:", cap(s))

    // スライスに新しい要素を追加します。
    s = append(s, 40)
    s = append(s, 50)

    // スライスの要素を表示します。
    fmt.Println("スライスの内容:", s)

    // スライスの現在の長さとキャパシティを再表示します。
    fmt.Println("スライスの長さ:", len(s))
    fmt.Println("スライスのキャパシティ:", cap(s))

    // さらに要素を追加し、キャパシティが増加する様子を確認します。
    s = append(s, 60)
    fmt.Println("要素を追加後のスライスの内容:", s)
    fmt.Println("追加後のスライスの長さ:", len(s))
    fmt.Println("追加後のスライスのキャパシティ:", cap(s))
}

正解コードの解説

このコードでは、Go言語のスライスとそのキャパシティの動作について学びます。スライスはGoで非常に便利なデータ構造で、可変長の配列のようなものです。

この解説では、スライスの作成、要素の追加、長さとキャパシティの関係について詳しく説明します。

スライスの作成

s := make([]int, 3, 5)

ここでは、make関数を使って、int型のスライスを作成しています。スライスの初期長さは3、キャパシティは5です。キャパシティはスライスが保持できる要素の最大数を示しますが、現在の長さはその中で実際に使用されている要素数です。

スライスへの要素の追加

スライスには初期値を設定します。

s[ 0] = 10
s[ 1] = 20
s[ 2] = 30

その後、append関数を使用してスライスに新しい要素を追加します。

s = append(s, 40)
s = append(s, 50)

これにより、スライスの長さは5に達し、キャパシティも使い切られます。

キャパシティの自動拡張

さらに要素を追加することで、キャパシティが自動的に拡張される様子を確認します。

s = append(s, 60)

この操作により、スライスのキャパシティが自動的に倍増し、新たな要素を格納できるようになります。

スライスの長さとキャパシティの確認

次のように、スライスの長さとキャパシティを確認することができます。

fmt.Println("スライスの長さ:", len(s))
fmt.Println("スライスのキャパシティ:", cap(s))

スライスの長さは実際に使用されている要素の数であり、キャパシティはスライスが保持できる要素の最大数です。

要素を追加するとキャパシティが自動的に拡張されるため、大量のデータを処理する場合でもパフォーマンスが保たれます。

まとめ

このコードを通じて、スライスの基本操作とキャパシティの動作を理解できました。スライスは、固定サイズの配列に比べて柔軟性が高く、Go言語でのデータ管理に非常に役立ちます。

スライスのキャパシティを把握することで、効率的なメモリ管理が可能になります。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る