📌

Golang 構造体

2021/07/25に公開

構造体の宣言

type Student struct {
    ID        int
    FirstName string
    LastName  string
}

変数の宣言

var Ryo Student

変数宣言と同時に初期化

student := Student{1001, "Ryo", "Sato"}

フィールドを明示的にすることも可能。
全てのフィールドを指定しなくてもいい

student := Student{LastName: "Sato", FirstName: "Ryo"}

フィールドへのアクセス

student.ID = 1001
fmt.Println(student.FirstName)

構造体ポインタの作成

student := Student{LastName: "Sato", FirstName: "Ryo"}
fmt.Println(student)
studentCopy := &student
studentCopy.FirstName = "Taro"
fmt.Println(student)

実行

{0 Ryo Sato}
{0 Taro Sato}

ポインタを使えば構造体の中身を変更できる

構造体の埋め込み

構造体に別の構造体を埋め込む

type Person struct {
    ID        int
    FirstName string
    LastName  string
}

type Student struct {
    Person
    Score   int
}
func main() {
    student := Student{
        Person: Person{
            FirstName: "Ryo",
        },
    }
    student.LastName = "Sato"
    fmt.Println(student.FirstName)
}

すべてのフィールドが自動的に埋め込まれるので、Student構造体からPersonのフィールドに直接アクセスできている

構造体をJSONで扱う

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    ID        int
    FirstName string `json:"name"`
    LastName  string
}

type Student struct {
    Person
    Score int
}

func main() {
    students := []Student{
        Student{
            Person: Person{
                LastName: "Sato", FirstName: "Ryo",
            },
        },
    }

    data, _ := json.Marshal(students)
    fmt.Printf("%s\n", data)

    var decoded []Student
    json.Unmarshal(data, &decoded)
    fmt.Printf("%v", decoded)
}

実行

[{"ID":0,"name":"Ryo","LastName":"Sato","Score":0}]
[{{0 Ryo Sato } 0}]

JSONの出力結果ではキーFirstNamedが指定したnameに変わっている

GitHubで編集を提案

Discussion