構造体

Go(Golang)の「構造体(struct)」は、複数の異なる型のデータをひとつにまとめることができるユーザー定義のデータ型です。C言語やC++などの構造体と似た役割を持ち、オブジェクト指向言語における「クラス」に近い役割を果たします。ただし、Goにはクラスや継承の概念はなく、構造体とインタフェースを使ってオブジェクト指向的な設計を行います。


1. 基本的な構造体の定義と使用

go
package main import "fmt" type Person struct { Name string Age int } func main() { p := Person{Name: "Taro", Age: 20} fmt.Println(p.Name) // 出力: Taro fmt.Println(p.Age) // 出力: 20 }
  • type Person struct { ... }Personという名前の構造体を定義。

  • NameAgeは、その構造体のフィールド。

  • フィールドには異なるデータ型を指定できる。


2. フィールドへのアクセスと更新

構造体のフィールドにはドット演算子(.)でアクセスします。

go
p.Name = "Jiro" p.Age = 25

3. 構造体のポインタ

構造体をポインタとして扱うことで、大きなデータのコピーを避けることができます。

go
p := &Person{Name: "Hanako", Age: 30} fmt.Println(p.Name) // ポインタでもドットでアクセス可能 p.Age = 31

Goでは、ポインタ経由のアクセスでも明示的なデリファレンス((*p).Age)は不要で、p.Ageと書けるように設計されています。


4. 無名構造体(匿名構造体)

名前を付けずに一時的に構造体を定義することも可能です。

go
person := struct { Name string Age int }{ Name: "Ken", Age: 28, } fmt.Println(person)

5. 構造体と関数(メソッドのように振る舞う)

構造体に関連する処理を関数として定義できます。Goではこれを「メソッド」と呼びます。

go
func (p Person) Greet() { fmt.Printf("こんにちは、%sさん!\n", p.Name) }

ポインタレシーバを使えば、構造体の中身を書き換えることができます。

go
func (p *Person) HaveBirthday() { p.Age++ }

6. ネストされた構造体

構造体の中に他の構造体を含めることもできます。

go
type Address struct { City string State string } type Employee struct { Name string Address Address }

7. 埋め込み(Go特有の擬似継承)

Goでは構造体の埋め込み(embedding)により、擬似的に継承のような振る舞いが可能です。

go
type Human struct { Name string } type Student struct { Human // 埋め込み Grade int } s := Student{Human: Human{Name: "Sato"}, Grade: 3} fmt.Println(s.Name) // 埋め込まれたフィールドに直接アクセスできる

まとめ

特徴 説明
定義 type 構造体名 struct { フィールド }
アクセス ドット(.)演算子を使ってフィールドへアクセス
ポインタ使用 効率的なメモリ使用と値の更新が可能
メソッド 構造体に関連付けた関数定義が可能(ポインタレシーバも使用可)
埋め込み 擬似継承を実現するGo独自の構文

生成日:2025/05/03