埋め込み構造体
CoddyのGOジャーニー「基礎」セクションの一部 — レッスン 99/109。
Goでは、ある構造体を別の構造体に埋め込むことができ、コンポジション(合成)関係を構築できます。これは継承に対するGoのアプローチです。
2つの構造体を定義し、一方をもう一方に埋め込みます:
type Address struct {
city string
state string
}
type Person struct {
name string
age int
Address // 埋め込み構造体(フィールド名なし)
}
func main() {
person := Person{
name: "Alice",
age: 30,
Address: Address{city: "Portland", state: "Oregon"},
}
// フィールドに直接アクセスする
fmt.Println(person.city) // 埋め込まれたフィールドにアクセスする
}
出力は、埋め込まれた構造体のフィールドに直接アクセスできることを示しています:
Portlandチャレンジ
初心者このチャレンジでは、Goにおける埋め込み構造体(コンポジション)の使用を練習します。
Address と Person という2つの構造体があります。Person 構造体は Address 構造体を埋め込む必要があり、これにより Person インスタンスから直接住所のフィールドにアクセスできるようになります。
あなたのタスクは、Address 構造体を埋め込むように Person 構造体の定義を完成させ、その後、Person インスタンスから直接住所のフィールドにアクセスすることです。
チートシート
Goはコンポジションのために構造体の埋め込み(struct embedding)を使用します。フィールド名なしで構造体型を含めることで、ある構造体を別の構造体の中に埋め込みます。
type Address struct {
city string
state string
}
type Person struct {
name string
age int
Address // 埋め込み構造体(フィールド名なし)
}
埋め込まれた構造体のフィールドには直接アクセスできます:
person := Person{
name: "Alice",
age: 30,
Address: Address{city: "Portland", state: "Oregon"},
}
fmt.Println(person.city) // 埋め込まれたフィールドに直接アクセスする
自分で試してみよう
package main
import "fmt"
// Address 構造体は場所の情報を保持します
type Address struct {
Street string
City string
ZipCode string
}
// Person 構造体は Address 構造体を埋め込む必要があります
type Person struct {
Name string
Age int
// TODO: ここに Address 構造体を埋め込んでください(1行のみ)
}
func main() {
// 住所情報を持つ新しい人物を作成します
person := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Wonderland",
ZipCode: "12345",
},
}
// 住所を含む人物情報を出力します
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
// TODO: person インスタンスから直接住所フィールドを出力してください
// (person.Address.Street などを使用せずに)
fmt.Println("Street:", person.Street)
fmt.Println("City:", person.City)
fmt.Println("ZipCode:", person.ZipCode)
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。