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つの構造体を、別の構造体に埋め込んで利用することができます。
埋め込みには、構造体名をフィールド名として利用し、データを入れ子になるような形で割り当てます。
埋め込まれた内側の構造体の型は外側の型に昇格されて、内側のデータに各フィールド名でアクセスすることができます。