スキップしてメイン コンテンツに移動

Go構造体初期化と埋め込み

Go構造体初期化と埋め込み

Go初心者のための構造体入門

Go言語でデータを整理する基本的な手段が構造体(struct)です。構造体は複数のフィールドをまとめて一つの型として扱えるため、データ構造の定義に不可欠です。Go初心者が最初に触れるべき概念は、構造体の宣言とフィールドの型指定です。

以下は簡単な構造体の定義例です。

type Person struct {
    Name string
    Age  int
}

この例では、Personという構造体にNameとAgeというフィールドを持たせています。フィールド名は大文字で始めるとエクスポートされ、他のパッケージからもアクセス可能になります。

structのフィールドと初期化

構造体を使う際に重要なのがフィールドの初期化です。Goでは構造体のインスタンスを作るときに、フィールドを個別に指定する方法と、構造体リテラルを使う方法があります。

個別に指定する場合は、次のようにします。

p := Person{}
p.Name = "Alice"
p.Age = 30

構造体リテラルを使うと、宣言と同時に値を設定できます。

p := Person{
    Name: "Bob",
    Age:  25,
}

フィールド名を省略して順序で指定することも可能ですが、可読性が低くなるため推奨されません。

構造体リテラルと埋め込み

構造体リテラルは構造体の初期化に便利ですが、さらに構造体を他の構造体に埋め込むことで継承に似た機能を実現できます。埋め込みは匿名フィールドとして宣言します。

type Address struct {
    City  string
    State string
}

type Employee struct {
    Person   // 埋め込み
    Address // 埋め込み
    Salary   float64
}

このようにすると、EmployeeはPersonとAddressのフィールドを直接参照できます。

e := Employee{
    Person: Person{
        Name: "Carol",
        Age:  28,
    },
    Address: Address{
        City:  "Tokyo",
        State: "Kanto",
    },
    Salary: 50000,
}
fmt.Println(e.Name)   // Carol
fmt.Println(e.City)   // Tokyo

埋め込みはデータ構造を再利用し、コードの重複を減らすのに有効です。

カスタム型とデータ構造の定義

Goでは基本型をベースにカスタム型を定義することで、型安全性と可読性を高められます。例えば、ユーザーIDを表す型を作ると、誤って整数を渡してしまうリスクを減らせます。

type UserID int

func (id UserID) String() string {
    return fmt.Sprintf("user-%d", id)
}

カスタム型は構造体のフィールドとしても使えます。以下は複合データ構造の例です。

type Order struct {
    ID     OrderID
    Items  []Item
    Total  float64
    Status OrderStatus
}

このようにデータ構造を定義すると、コード全体で一貫した型を使えるため、バグの発生を抑えられます。Go初心者はまず構造体とフィールドの基本を理解し、次に構造体リテラル、埋め込み、カスタム型を組み合わせて実践的なデータ構造を作る練習をすると良いでしょう。

この記事はAIによって作成されました。

コメント