Menu
CoddyTech

埋め込み構造体

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
challenge icon

チャレンジ

初心者

この課題では、Goの埋め込み構造体(コンポジション)の使い方を練習します。

2つの構造体、AddressとPersonがあります。人が住所のフィールドに直接アクセスできるように、Person構造体にAddress構造体を埋め込む必要があります。

あなたの課題は、Address構造体を埋め込むようにPerson構造体の定義を完成させることです。main内のprint文は、すでに人から住所のフィールドに直接アクセスしています(person.Street、person.City、person.ZipCode)。Addressを埋め込めばコンパイルできます。

自分で試してみよう

package main

import "fmt"

// Address structには所在地の情報が含まれる
type Address struct {
	Street  string
	City    string
	ZipCode string
}

// Person structにはAddress structを埋め込む必要がある
type Person struct {
	Name string
	Age  int
	// TODO: ここにAddress structを埋め込む(1行だけ)
}

func main() {
	// 住所情報を含む新しいpersonを作成する
	person := Person{
		Name: "Alice",
		Age:  30,
		Address: Address{
			Street:  "123 Main St",
			City:    "Wonderland",
			ZipCode: "12345",
		},
	}

	// 住所を含むpersonの情報を出力する
	fmt.Println("Name:", person.Name)
	fmt.Println("Age:", person.Age)
	
	// personインスタンスから住所のフィールドを直接出力する
	fmt.Println("Street:", person.Street)
	fmt.Println("City:", person.City)
	fmt.Println("ZipCode:", person.ZipCode)
}
quiz icon腕試し

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

基礎のすべてのレッスン

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