【Go言語】構造体を要素に持つスライスの作成・要素追加・初期化方法まとめ

Go言語

スライスとは可変長の配列のことです。

Go言語でWeb APIを実装する場合(= JSONレスポンスを作成する場合)などで以下のような『構造体を要素に持つスライス』を作成する機会があります。

users = [
  { "name": "Suzuki",
    "age": 20
  },
  { "name": "Tanaka",
    "age": 21
  },
]

今回は、構造体を要素に持つスライスの作成方法についてまとめます。

構造体を要素に持つスライスの作成(変数定義)方法

スライスの作成は、型[]T(型Tのスライスを表す)を利用する方法
と、make関数を利用する方法があります。1 2

User構造体のスライスをusers変数として扱う場合、スライスの作成方法には以下の種類があります。

  • make関数を利用する方法
    • make([]User, 0)
  • []を利用する方法
    • users := []User{}
    • var users []User
    • var users []User = []User{}

以下からわかるように、上記のスライス作成方法はすべて同じ結果になります。

package main

import "fmt"

type User struct {
  name string
  age  int
}

func main() {
  users_1 := []User{}
  var users_2 []User
  var users_3 []User = []User{}
  users_4 := make([]User, 0)

  fmt.Println(users_1, len(users_1), cap(users_1)) // [] 0 0
  fmt.Println(users_2, len(users_2), cap(users_2)) // [] 0 0
  fmt.Println(users_3, len(users_3), cap(users_3)) // [] 0 0
  fmt.Println(users_4, len(users_4), cap(users_4)) // [] 0 0
}


スライスに構造体を要素として追加する方法

スライスへ新しい要素を追加するには、append関数を利用します。3

package main

import "fmt"

type User struct {
  name string
  age  int
}

func main() {
  users := []User{}
  user_1 := User{name: "Suzuki", age: 20}
  users = append(users, user_1)
  fmt.Println(users) // [{Suzuki 20}]

  user_2 := User{name: "Tanaka", age: 21}
  users = append(users, user_2)
  fmt.Println(users) // [{Suzuki 20} {Tanaka 21}]
}


構造体の初期化方法の詳細は【Go言語】構造体の初期化方法の種類まとめで解説しているのであわせてご覧になってください。

参考: スライスをJSONに変換する方法

スライスをJSONに変換する場合は以下のようにします。

package main

import (
  "encoding/json"
  "fmt"
)

// jsonで構造体を扱えるようにするため、構造体のフィールド名は大文字にする
// jsonタグでJSONのプロパティ名を設定できる
type User struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}

func main() {
  users := []User{}

  user_1 := User{Name: "Suzuki", Age: 20}
  users = append(users, user_1)
  fmt.Println(users) // [{Suzuki 20}]

  user_2 := User{Name: "Tanaka", Age: 21}
  users = append(users, user_2)
  fmt.Println(users) // [{Suzuki 20} {Tanaka 21}]

  bytes, _ := json.Marshal(users)
  fmt.Println(string(bytes)) // [{"name":"Suzuki","age":20},{"name":"Tanaka","age":21}]
}

参考: スライスの作成と初期化をまとめて行う方法

以下のようにすると、スライスの作成と初期化(= 要素となる構造体をセット)を1行で行えます。

package main

import (
  "fmt"
)

type User struct {
  name string
  age  int
}

func main() {
  users := []User{{"Suzuki", 20}, {"Tanaka", 21}}
  fmt.Println(users) // [{Suzuki 20} {Tanaka 21}]
}

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!