0Pricing
Go Academy · レッスン

構造体の埋め込み

構造体を組み合わせます

「構造体の埋め込み」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

構造体を組み合わせる

Goにはクラス継承がありません。その代わりに埋め込みがあり、フィールド名を付けずに1つの構造体を別の構造体の中に配置することで、フィールドやメソッドを再利用できます。

無名フィールド

埋め込みフィールドは名前を付けず、型だけを指定して宣言します。そのメンバーは外側の構造体に昇格します。

package main

import "fmt"

type Engine struct{ Power int }

type Car struct {
	Engine
	Brand string
}

func main() {
	c := Car{Engine: Engine{Power: 150}, Brand: "Coddy"}
	fmt.Println(c.Power, c.Brand)
}

昇格フィールドへのアクセス

Powerは埋め込まれたEngineに属していますが、c.Powerのように直接読み取れます。これがフィールドの昇格です。

完全なパスも引き続き使える

埋め込まれた構造体には、型名を使って常に明示的にアクセスできます。

package main

import "fmt"

type Engine struct{ Power int }
type Car struct{ Engine }

func main() {
	c := Car{Engine{200}}
	fmt.Println(c.Engine.Power)
	fmt.Println(c.Power)
}

埋め込みと名前付きフィールド

名前付きフィールド(engine Engine)にはc.engine.Powerでアクセスする必要があります。埋め込み(Engine)ではメンバーが昇格するため、c.Powerと書けます。埋め込みは「〜の一種」という関係を表します。

埋め込まれた構造体の初期化

複合リテラルでは、フィールドのキーとして型名を使います。

package main

import "fmt"

type Address struct{ City string }
type User struct {
	Address
	Name string
}

func main() {
	u := User{Address: Address{City: "Istanbul"}, Name: "Mert"}
	fmt.Println(u.Name, "in", u.City)
}

複数の埋め込み

構造体には複数の型を埋め込み、それらのフィールドを組み合わせることができます。

package main

import "fmt"

type Timestamps struct{ Created string }
type Author struct{ Name string }
type Post struct {
	Timestamps
	Author
	Title string
}

func main() {
	p := Post{Timestamps{"today"}, Author{"Ada"}, "Hello"}
	fmt.Println(p.Title, p.Name, p.Created)
}

名前の衝突

2つの埋め込み型に同じフィールド名があると、参照が曖昧なためコンパイルエラーになります。型名を付けて明示的に指定する必要があります。

外側の構造体によるシャドーイング

外側の構造体で宣言したフィールドは、同じ名前を持つ昇格フィールドをシャドーイングします。修飾なしでアクセスした場合は、外側のフィールドが優先されます。

package main

import "fmt"

type Base struct{ ID int }
type Item struct {
	Base
	ID int
}

func main() {
	i := Item{Base{1}, 99}
	fmt.Println(i.ID, i.Base.ID)
}

ポインタの埋め込み

ポインタ型を埋め込むこともできます。メンバーは引き続き昇格しますが、ポインタを初期化しないとnil参照が発生するおそれがあります。

package main

import "fmt"

type Logger struct{ Prefix string }
type Service struct{ *Logger }

func main() {
	s := Service{Logger: &Logger{Prefix: "[svc]"}}
	fmt.Println(s.Prefix)
}

埋め込みを使う場面

  • 共通のフィールド(タイムスタンプやID)を再利用する
  • 小さな型からより機能豊富な型を構築する
  • 深い入れ子や冗長なアクセスパスを避ける

クイックチェック

構造体の埋め込みに関する知識を確認しましょう。

まとめ

構造体の埋め込みを学びました。

  • 無名フィールドはメンバーを外側の構造体に昇格させます
  • c.Powerまたはc.Engine.Powerでアクセスできます
  • 外側のフィールドは昇格フィールドをシャドーイングします
  • 名前が衝突した場合は明示的な修飾が必要です
  • ポインタの埋め込みも使えます

よくある質問

「構造体の埋め込み」レッスンは無料ですか?

はい。「構造体の埋め込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「構造体の埋め込み」で何を学びますか?

構造体を組み合わせます ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「構造体の埋め込み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造体の埋め込み
  2. インターフェースの埋め込み
  3. メソッドプロモーション
  4. 継承よりもコンポジション
← Go Academyに戻る