構造体のネスト
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でオブジェクト指向のデータモデルを構築するための基本です。
チャレンジ
簡単ネストされた構造体が、現実世界の階層構造をモデル化するのにどのように役立つかを示す、従業員管理システムを作りましょう。従業員が部署に所属し、部署が所在地情報を持つ構造を作成します。
コードを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)
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ