カテゴリー: 未分類

  • 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言語のデータ操作がより効率的に行えるようになります。具体的なコード例や応用例を試しながら、さらに理解を深めていきましょう!