【Go入門】構造体の埋め込み(Embedded structs)

Go
スポンサーリンク

Go言語の構造体の基本を見て来ました。

ここでは構造体の埋め込み(Embedded)について扱います。

Goでは、1つの構造体を、別の構造体に埋め込むことができます。これを行うと、埋め込まれた内側の構造体の型が外側の型に昇格され、内側のデータにアクセスすることができます。

スポンサーリンク

構造体の基本形

では、Go言語の構造体の埋め込み(Embedded)についてやっていきましょう。

その前に、構造体の基本的な形について目を通しておきましょう。

実際のコードで、次のように書いてみます。

package main

import "fmt"

type character struct {
	name string
	age  int
}

func main() {

	c := character{
		name: "新垣結衣",
		age:  32,
	}

	fmt.Println(c)

	fmt.Println(c.name, c.age)
}

typeキーワードで構造体を宣言しています。

main()関数の中で、構造体にデータを当てはめ、Println()で構造体を代入した変数と、変数からフィールド名を指定して値を出力しています。

{新垣結衣 32}
新垣結衣 32

これが構造体の基本的な利用になります。

スポンサーリンク

構造体の埋め込み(Embedded)

上の基本的な形を利用して、構造体の埋め込み(Embedded)をやって行きます。

構造体の埋め込みの形は、次のような形になります。

type 埋め込み構造体名 struct {
	フィールド名 型名
	フィールド名 型名
}

type 構造体名 struct {
	埋め込み構造体名
	フィールド名 型名
}

上側は、通常の構造体の定義です。構造体の埋め込みについては下側になります。

上側で定義した構造体を、下側の構造体のフィールド名に入れているのがわかります。

埋め込みの形はこのようになります。

先ほど使ったコードを利用して、具体的にやってみましょう。

package main

import "fmt"

type character struct {
	name string
	age  int
}

type actor struct {
	character
	birthplace string
}

func main() {

	c := character{
		name: "新垣結衣",
		age:  32,
	}

	a := actor{
		character: character{
			name: "吉岡里帆",
			age:  27,
		},
		birthplace: "京都府",
	}

	fmt.Println(c)
	fmt.Println(a)

	fmt.Println(c.name, c.age)
	fmt.Println(a.name, a.age, a.birthplace)
}

二つの構造体が定義されているのがわかります。actorという二つ目の構造体に、characterというひとつ目の構造体がフィールド名として使われています。これが構造体の埋め込みです。

main()関数の中で、構造体にデータを当てはめています。

埋め込みの構造体の部分は、フィールド名に構造体名を記述して、コロンで構造体の値を波括弧{}で設定しています。カンマで続けて独自の値も設定しています。

ここでは、変数cが基本的な構造体、変数aが埋め込みを用いた構造体になります。

それぞれをPrintln()で出力しています。それぞれの値は、変数にドットでフィールド名を指定してアクセスします。

実行するとこうなります。

{新垣結衣 32}
{{吉岡里帆 27} 京都府}
新垣結衣 32
吉岡里帆 27 京都府

構造体を代入した変数をそのまま出力したものは、波括弧で括られて表示されています。埋め込み部分も波括弧の中で、波括弧で表示されているのがわかります。

それぞれの値の出力には、変数にドットでフィールド名を指定してアクセスしますが、埋め込み部分については、内側に埋め込まれた構造体が外側の構造体に昇格する形で、同じ変数で、フィールドにアクセスしているのがわかります。

スポンサーリンク

最後に

Go言語の構造体の埋め込み(Embedded)について見てきました。

構造体は、1つの構造体を、別の構造体に埋め込んで利用することができます。

埋め込みには、構造体名をフィールド名として利用し、データを入れ子になるような形で割り当てます。

埋め込まれた内側の構造体の型は外側の型に昇格されて、内側のデータに各フィールド名でアクセスすることができます。

Go
スポンサーリンク
CodeGraffitiをフォローする

タイトルとURLをコピーしました