Go/構造体

カテゴリ:Book:Go#構造体%20

Go言語のstructは、異なる型のフィールドをまとめて一つの型として定義するための複合型です。オブジェクト指向言語のクラスに近い役割を果たします。

基本的な定義

type Person struct {
    Name string
    Age  int
}

初期化の方法

// ゼロ値で初期化
var p Person

// フィールドを指定して初期化
p1 := Person{Name: "太郎", Age: 30}

// 順序通りに値を指定
p2 := Person{"花子", 25}

// newを使った初期化(ポインタが返される)
p3 := new(Person)
p3.Name = "次郎"
p3.Age = 28

// アドレス演算子を使った初期化
p4 := &Person{Name: "美香", Age: 22}

フィールドへのアクセス

// 値の設定
p.Name = "田中"
p.Age = 35

// 値の取得
fmt.Println(p.Name, p.Age)

// ポインタ経由でのアクセス
ptr := &p
ptr.Name = "佐藤"  // (*ptr).Name と同じ

埋め込み(Embedding)

type Employee struct {
    Person    // 匿名フィールド(埋め込み)
    Company string
    Salary  int
}

emp := Employee{
    Person:  Person{Name: "山田", Age: 32},
    Company: "ABC株式会社",
    Salary:  500000,
}

// 埋め込まれたフィールドに直接アクセス可能
fmt.Println(emp.Name)  // emp.Person.Name と同じ

メソッドの定義

// 値レシーバ
func (p Person) Greet() string {
    return "こんにちは、" + p.Name + "です"
}

// ポインタレシーバ
func (p *Person) SetAge(age int) {
    p.Age = age
}

// 使用例
p := Person{Name: "鈴木", Age: 40}
fmt.Println(p.Greet())
p.SetAge(41)

構造体タグ

type User struct {
    ID   int    <code>json:"id"</code>
    Name string <code>json:"name"</code>
    Age  int    <code>json:"age,omitempty"</code>
}

重要な特徴

  • Go言語には継承がありませんが、埋め込みとインターフェースで類似の機能を実現できます
  • 構造体は値型なので、代入時にはコピーが作成されます
  • 大文字で始まるフィールドは公開(exported)、小文字で始まるフィールドは非公開(unexported)です
  • 空の構造体struct{}はメモリを消費しません

structはGo言語でデータ構造を表現する最も基本的で重要な型です。

カテゴリ:Book:Go#構造体%20

{{DEFAULTSORT:こうそうたい}}

カテゴリ:Go
カテゴリ:Book:Go カテゴリ:Go カテゴリ:JsonConfig拡張機能を使用しているページ