スライスとは可変長の配列のことです。
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)やってます。フォローしてもらえるとうれしいです!