Go言語のスライスとMapの基本

Go言語のスライスとMapの基本

Go言語では、スライスやMapは非常に柔軟で強力なデータ構造です。この記事では、スライスやMapの基本的な使い方や特徴について解説します。


スライスとは

スライスは、サイズが可変の配列のようなものです。Goでは多くの場合、配列よりもスライスが使われます。

特徴

  1. サイズが可変:
    • スライスは配列と異なり、サイズを固定せずに要素を追加・削除できます。
  2. 参照型:
    • スライスは基底配列(Underlying Array)を参照します。
    • スライスをコピーしても、元のデータに影響を及ぼします。
  3. 長さと容量:
    • len(slice) はスライス内の現在の要素数を返します。
    • cap(slice) は基底配列の終端までの容量を返します。

基本例

package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5} // 配列
    slice := arr[1:4]             // スライス

    fmt.Println("slice:", slice)       // 出力: [2 3 4]
    fmt.Println("len(slice):", len(slice)) // 出力: 3
    fmt.Println("cap(slice):", cap(slice)) // 出力: 4
}

要素の追加

スライスにはappendを使って要素を追加します。

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3} // スライス
    slice = append(slice, 4, 5)
    fmt.Println(slice) // 出力: [1 2 3 4 5]
}

Pythonのリストとの比較

GoのスライスとPythonのリストは似た性質を持っています。

特徴GoのスライスPythonのリスト
サイズの可変性可変可変
要素の型同じ型のみ(int, stringなど)異なる型を混在可能
初期化リテラル []int{1, 2, 3}makeリテラル [1, 2, 3]
操作メソッドappend, copy などappend, extend, pop など
内部構造基底配列を参照する内部的に動的配列を保持

Pythonのリストは異なる型を混在させることが可能であり、Goのスライスより柔軟ですが、Goのスライスは型安全である点が特徴です。


Mapとは

Mapは、Pythonの辞書(dict)のような「キーと値」のペアを管理するデータ構造です。

特徴

  1. キーと値のペア:
    • Mapはキーを使って値にアクセスします。
    • キーは一意(ユニーク)でなければなりません。
  2. 参照型:
    • Mapもスライスと同様に参照型です。
  3. 順序保証なし:
    • Mapの要素には順序がありません。

基本例

package main

import "fmt"

func main() {
    m := make(map[string]int) // キー: string, 値: int
    m["apple"] = 1
    m["banana"] = 2

    fmt.Println(m) // 出力: map[apple:1 banana:2]
}

要素の追加と更新

  • 要素を追加するには、map[key] = value を使います。
  • 同じキーに対して値を再割り当てすると、既存の値が上書きされます。
package main

import "fmt"

func main() {
    m := make(map[string]int)
    m["apple"] = 1       // 要素の追加
    m["apple"] = 10      // 値の更新
    m["cherry"] = 3      // 新しい要素の追加

    fmt.Println(m) // 出力: map[apple:10 cherry:3]
}

要素の削除

Goでは、delete関数を使ってMapから要素を削除できます。

package main

import "fmt"

func main() {
    m := map[string]int{"apple": 1, "banana": 2}
    delete(m, "banana") // 要素の削除
    fmt.Println(m)        // 出力: map[apple:1]
}

GoのMapとPythonのdictの比較

特徴GoのMapPythonのdict
キーの型任意の比較可能型(例: int, string)任意のハッシュ可能型
値の型任意の型(型を固定)任意の型
初期化make(map[string]int) またはリテラルリテラル { "key": value }
順序順序保証なし3.7以降は挿入順を保持
要素の追加map[key] = valuedict[key] = value
要素の削除delete(map, key)del dict[key]
キーの存在確認value, exists := map[key]key in dict
操作メソッド手動操作が主多数のビルトインメソッド(items, keys, values

GoのMapは型安全性を持ちながら、Pythonのdictに似た柔軟性を提供します。ただし、Pythonのdictの方が多機能で簡潔な操作が可能です。


Mapとスライスの組み合わせ

Mapの値にスライスを持たせることで、複雑なデータ構造を扱うことができます。

例: Mapにスライスを格納

package main

import "fmt"

func main() {
    m := make(map[string][]int)

    m["numbers"] = []int{1, 2, 3}       // スライスを追加
    m["numbers"] = append(m["numbers"], 4) // スライスを更新

    fmt.Println(m) // 出力: map[numbers:[1 2 3 4]]
}

まとめ

  • スライス:
    • 配列のような構造でサイズが可変。
    • appendを使って要素を追加。
  • Map:
    • 「キーと値」のペアを管理。
    • 直接 map[key] = value で要素を追加・更新。
  • Pythonとの比較:
    • スライスはPythonのリストに似ており、型安全で効率的。
    • MapはPythonの辞書に似ており、キーと値のペアを動的に管理可能。

スライスやMapを理解することで、Go言語のデータ操作がより効率的に行えるようになります。具体的なコード例や応用例を試しながら、さらに理解を深めていきましょう!

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です