[Go言語 入門] Embedded とコンストラクタ
golangで作ってみたいものがあり、golangを学び始めたので学習したことを書いていくノート。
---------------------------------------------------
サイトマップはこちら
---------------------------------------------------
第16回 Embedded とコンストラクタ
golang にはクラスという概念がないので、継承という概念もない。
golang で継承のようなことをしたい場合はどのようにすればいいか。
「Embedded」の仕組みを理解する。
一言でまとめると、構造体に構造体を埋め込むこと。
以下構造体を例とする。
// main.go
type Person struct {
Name string
Age int
}
type Student struct {
Id int
Person
}
まずは、名前と年齢を持つ構造体 Person を定義した。
次に出席番号と名前、年齢を持つ構造体 Student を定義したい。
名前と年齢はすでに構造体 Person で定義されているので、上記のように Id(出席番号)と構造体 Person を構造体 Student に定義する。
以上で継承のようなことが可能。
呼び出すと以下のような結果となる。
func main() {
taro := Student{16, Person{"Suzuki Taro", 15}}
fmt.Println(taro)
fmt.Println(taro.Id)
fmt.Println(taro.Name)
fmt.Println(taro.Age)
}
// 実行結果
// {16 {Suzuki Taro 15}}
// 16
// Suzuki Taro
// 15
~ コンストラクタ ~
「 Student{ 16, Person{ "Suzuki Taro", 15 } } 」
のように構造体内に構造体を書いて宣言するのがなんか嫌だ!
そんなあなたにはコンストラクタでの宣言をお勧めする。
書き方は以下
func NewStudent(id int, name string, age int) *Student {
return &Student{id, Person{Name: name, Age: age}}
}
func main() {
hina := NewStudent(20, "Takahashi Hina", 15)
fmt.Println(hina)
fmt.Println(hina.Id)
fmt.Println(hina.Name)
fmt.Println(hina.Age)
}
// 実行結果
// &{20 {Takahashi Hina 15}}
// 20
// Takahashi Hina
// 15
学生情報(出席番号、名前、年齢)を引数にとり、NewStudent関数でポインタ型の構造体を返却する。
関数名を NewStudent としたが、名前に特に決まりはない。
New○○とするのがいいのではないだろうか。
このようにすれば、main関数での宣言は綺麗でシンプルになる!
以上