構造体の埋め込み
構造体を組み合わせます
「構造体の埋め込み」は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フィードバックを取得できます。ローカル設定は不要です。