見出し画像

[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関数での宣言は綺麗でシンプルになる!

以上


いいなと思ったら応援しよう!