Menu
CoddyTech

構造体のネスト

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 16/107。

ネストされた構造体とは、フィールドの1つとして別の名前付き構造体を含む構造体です。小さく再利用可能な型を組み合わせることで、複雑で階層的なデータをモデル化できます。

type Address struct {
    Street string
    City   string
    ZIP    string
}

type Person struct {
    Name    string
    Age     int
    Address Address  // 入れ子になった構造体
}

ネストされた構造体のフィールドにアクセスするには、フィールド名をドットでつなぎます。

p := Person{
    Name: "Alice",
    Age:  30,
    Address: Address{
        Street: "123 Main St",
        City:   "Boston",
        ZIP:    "02101",
    },
}

fmt.Println(p.Address.City) // Boston

ネスト化はコードの再利用を促進します。Address型は、フィールドを重複させることなく、Person、Company、Orderなどの複数の構造体で使用できます。この方法は、エンティティが他のエンティティを含むという現実世界の関係を反映しています。

type Company struct {
    Name      string
    Employees int
    Address   Address  // 同じAddress型を再利用
}

構造体は複数の階層にネストできますが、階層を浅く保つと読みやすさが向上します。ネストした構造体は、Goでオブジェクト指向のデータモデルを構築するための基本です。

challenge icon

チャレンジ

簡単

ネストされた構造体が、現実世界の階層構造をモデル化するのにどのように役立つかを示す、従業員管理システムを作りましょう。従業員が部署に所属し、部署が所在地情報を持つ構造を作成します。

コードを2つのファイルに分けて整理します。

  • models.go:連携して機能する3つの構造体を定義します。
    • Location:Building(string)とFloor(int)フィールドを持つ
    • Department:Name(string)と、ネストされたLocationフィールドを持つ
    • Employee:ID(int)、Name(string)、およびネストされたDepartmentフィールドを持つ
  • main.go:入力から従業員情報を読み取り、適切にネストされた構造体を使ってEmployeeを作成し、ネストされた構造を通じてフィールドにアクセスして、従業員のプロフィール全体を表示します。

次の入力が与えられます。

  • 1行目:従業員ID(整数)
  • 2行目:従業員名
  • 3行目:部署名
  • 4行目:建物名
  • 5行目:階数(整数)

出力形式:

Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]

101、Alice、Engineering、Tower、5が与えられた場合、出力は次のようになります。

Employee: Alice (ID: 101)
Department: Engineering
Location: Tower, Floor 5

ドット記法を使ってネストされたフィールドにアクセスし、構造体の階層をたどります(例:employee.Department.Location.Building)。

自分で試してみよう

package main

import "fmt"

func main() {
	// 従業員情報を読み込む
	var id int
	var name string
	var deptName string
	var building string
	var floor int

	fmt.Scanln(&id)
	fmt.Scanln(&name)
	fmt.Scanln(&deptName)
	fmt.Scanln(&building)
	fmt.Scanln(&floor)

	// TODO: 適切にネストされた構造体を使用してEmployeeを作成する
	// models.goのLocation、Department、Employee構造体を使用する
	// 入力値ですべてのネストされたフィールドを初期化する

	// TODO: 次の形式で従業員プロファイルを出力する:
	// Employee: [Name] (ID: [ID])
	// Department: [DepartmentName]
	// Location: [Building], Floor [Floor]
	// ドット記法を使用してネストされたフィールドにアクセスする (例: employee.Department.Location.Building)
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ