Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

struct

『struct』(構造体)はGoで複数のフィールドをまとめるデータ型です。クラスを持たないGoでオブジェクト指向的な設計を実現する中心的な仕組みで、メソッドの追加や埋め込みによる継承的な表現も可能です。

構文
// 構造体の定義
type 構造体名 struct {
    フィールド名 型
    フィールド名 型
}

// 初期化方法
s1 := 構造体名{値1, 値2}              // フィールド順で指定(非推奨)
s2 := 構造体名{フィールド名: 値}      // フィールド名で指定(推奨)
var s3 構造体名                        // ゼロ値で初期化
s4 := new(構造体名)                    // *構造体名 が返ります。

// フィールドへのアクセス
s2.フィールド名

// 構造体埋め込み(他の構造体のフィールドとメソッドを「継承」します)
type 親構造体 struct { ... }
type 子構造体 struct {
    親構造体    // フィールド名なしで埋め込みます。
    追加フィールド 型
}
構造体の機能
機能概要
フィールド定義型が異なる複数の値をまとめて管理できます。
タグフィールドにメタ情報を付加します(JSONキー名など)。バッククォートで囲みます。
埋め込み型名だけを書くことで、そのフィールドとメソッドを昇格(プロモーション)します。
無名構造体型名なしで一時的な構造体を定義できます。テストデータなどに便利です。
サンプルコード
package main

import "fmt"

// 基本的な構造体定義です。
type Person struct {
    Name string
    Age  int
}

// 構造体埋め込みの例です。
type Address struct {
    City    string
    Country string
}

type Employee struct {
    Person          // Personのフィールドとメソッドが昇格します。
    Address         // Addressのフィールドが昇格します。
    Department string
}

// JSONタグ付き構造体(encoding/jsonと組み合わせて使います)
type Product struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Price float64 `json:"price,omitempty"` // ゼロ値のとき省略します。
}

func main() {
    // 構造体の初期化(フィールド名指定推奨)
    p := Person{Name: "山田太郎", Age: 30}
    fmt.Printf("名前: %s, 年齢: %d\n", p.Name, p.Age)

    // ポインタ経由でフィールドを変更します。
    pp := &p
    pp.Age = 31 // (*pp).Age = 31 と同じです。Goは自動的にデリファレンスします。
    fmt.Println("誕生日後の年齢:", p.Age)

    fmt.Println()

    // 埋め込み構造体
    emp := Employee{
        Person:     Person{Name: "鈴木花子", Age: 25},
        Address:    Address{City: "東京", Country: "日本"},
        Department: "エンジニアリング",
    }
    // 埋め込みフィールドは昇格されるため直接アクセスできます。
    fmt.Println("社員名:", emp.Name)       // emp.Person.Name と同じです。
    fmt.Println("都市:", emp.City)          // emp.Address.City と同じです。
    fmt.Println("部門:", emp.Department)

    fmt.Println()

    // 無名構造体(テストデータなど一時的な用途に使います)
    point := struct {
        X, Y int
    }{X: 10, Y: 20}
    fmt.Printf("座標: (%d, %d)\n", point.X, point.Y)
}
概要

Goの構造体はクラスの代わりとして使われます。フィールドの大文字・小文字によってパッケージ外への公開・非公開が決まります(大文字で始まれば公開)。構造体は値型なので代入やコピーは値のコピーになります。大きな構造体を関数に渡す場合はポインタを使って効率化します。

構造体のフィールド名が小文字で始まる場合、そのフィールドはパッケージ外から見えず、encoding/jsonやreflectパッケージでも扱えません。公開が必要なフィールドは必ず大文字で始めてください。

構造体へのメソッド追加は『メソッド / レシーバ』、インタフェースとの組み合わせは『interface』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。