Go言語学習3日目:Struct・Slice・Mapを学んでみた話。。(Go Tourでコツコツ継続中)

Go言語学習も3日目に突入しました。

前回まではコチラ

kunio-ud-all.com

今日は Go Tour(日本語版) を参考にしながら、以下の3つを学んでみました 👇

  • Struct(構造体)
  • Slice(スライス)
  • Map(マップ)

正直、最初のページでポインタの話が出てきたので「ちょっと難しそう。。」って思ってたんですが、実際に手を動かしてみると案外楽しくて 文系SEでも理解しやすい構文で、今日も30分、コツコツ前進できました!

A Tour of Go


Struct(構造体)ってなに?

まずは構造体(Struct)から。 C#でいう「クラス」的な役割を果たす、Goの独自データ型です。

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "たろう", Age: 30}
    fmt.Println(p)
}

フィールドにもアクセスできます👇

fmt.Println(p.Name) // "たろう"

構造化しておくことで、意味のあるデータとして扱いやすくなりますね。


Slice(スライス):配列より柔軟!

次に学んだのはSlice。 Goには配列もありますが、スライスのほうが実用的で便利です。

func main() {
    fruits := []string{"りんご", "バナナ", "みかん"}
    fruits = append(fruits, "ぶどう")
    fmt.Println(fruits) // [りんご バナナ みかん ぶどう]
}
  • []string{} のように宣言
  • append を使って要素を追加できる
  • 配列よりも長さが可変で扱いやすい!
  • Pythonのリストっぽい感覚で扱えるので、文系脳にもやさしい。。

    スライスのいろいろな操作

    // 部分取り出し
    subset := fruits[1:3] // バナナ, みかん
    
    // 要素の更新
    fruits[0] = "メロン"
    
    // ループ処理
    for i, f := range fruits {
        fmt.Println(i, f)
    }
    

    make を使って初期化も可能

    nums := make([]int, 3) // [0 0 0]
    

    メモリを先に確保したいときに使うけど、僕は初心者なので、 append から!!! 昔?のmallocを思い出しますね。

    nilスライスってなに?

    ここでちょっと深掘り。 Goでは、スライスの初期状態が nil になることがあります👇

    var s []int
    fmt.Println(s == nil) // true
    fmt.Println(len(s))   // 0
    
    nilスライスとは?

    → まだ何も作られてない・初期化されていないスライスのこと。

    空スライスとの違い
    var a []int      // nilスライス
    b := []int{}     // 空スライス
    
    fmt.Println(a == nil) // true
    fmt.Println(b == nil) // false ←ここ注意!
    
    nilスライスでもappendできる!
    var s []int
    s = append(s, 1, 2, 3)
    fmt.Println(s) // [1 2 3]
    

    なので、あまり深く気にせず append します! ただし、「nilと空の違い」は覚えておきます!


    Map(マップ):キーと値でデータを管理

    最後はMap(連想配列)です!

    ages := map[string]int{
        "たろう": 30,
        "はなこ": 25,
    }
    
    ages["じろう"] = 28
    fmt.Println(ages["はなこ"]) // 25
    

    キーでデータを素早く取り出せるのが強み!

    キーの存在チェックもできる
    value, ok := ages["はなこ"]
    if ok {
        fmt.Println("存在してます!", value)
    }
    
  • 宣言:map[キーの型]値の型
  • 初期化:map[string]int{} のように中カッコで
  • 追加・更新・削除もシンプル
  • まだ、初期化が慣れないですが、、、こういうのは何回も書いていけば、覚えていくかな。 pythonでもそうだったし。


    今日のまとめ

    • Struct:複数の値をひとまとまりにする
    • Slice:appendやスライス構文で柔軟に操作できる
    • nilスライス:初期化されてないスライス。appendで自動的に使えるようになる
    • Map:キーと値の組み合わせで高速にデータ管理
    • Go Tourで実行しながら学べるのが最高!

    ただ、やはり、まだまだ慣れていないです。当たり前ですが、、、


    (この記事は広告を含みます)