3.4 構造体の埋め込みで共通部分を使いまわす

これまで構造体の基本的な定義の仕方、メソッドの定義について紹介しました。この中で、複数の階層を持った構造体の作り方も紹介しました。

これとは別に、多くのモデル構造体を作成するときなど、複数階層ではなく1つの階層で共通部分を使いまわしたいことがあります。そのようなニーズに対するソリューションとして、Goは構造体の埋め込みを提供しています1

埋め込みには、名前をつけずに型だけを構造体のフィールドとして記述します。

type Book struct {
	Title string
	ISBN  string
}

func (b Book) GetAmazonURL() string {
	return "https://amazon.co.jp/dp/" + b.ISBN
}

type OreillyBook struct {
	Book
	ISBN13 string
}

func (o OreillyBook) GetOreillyURL() string {
	return "https://www.oreilly.co.jp/books/" + o.ISBN13 + "/"
}

OreillyBook構造体をこのように宣言すると、インスタンス利用時には埋め込んだBook構造体のフィールドが、あたかも一緒に宣言されたもののようにふるまいます。ただし「同じような」挙動をするのは、あくまでもフィールドの参照とメソッドを呼び出すインスタンスの利用時のみです。インスタンス作成時には型名と同名のフィールドが存在するように書く必要があります。

	ob := OreillyBook{
		ISBN13: "9784873119038",
		Book: