📚

Goの構造体で継承っぽいことをする

に公開

はじめに

Goで継承は使えないのでどうやるかというと構造体をいい感じで利用して実装します。

使えないってよりは、継承の概念がないと思います。

この記事で書くことが⭐️の内容です。

⭐️1. 構造体⭐️
1-1. 構造体の書き方
1-2.メソッドと構造体
⭐️2. 構造体の埋め込み⭐️
2-1. 構造体を増やし、親子関係を作る

  1. インターフェース
  2. 構造体とインターフェース

やってみよう!

1,構造体とは

構造体はtypestructを使用して定義します。
構造体をどうやってかくかとメソッドについても簡単に触れます

  1. type 構造体名 structで構造体を作成できる
  2. main関数の中でインスタンスを作成する
  3. フィールドに値を代入して使用する
package main

import "fmt"

// 名前のフィールドを持つAnimalという構造体を作成
type Animal struct {
    Name string //名前フィールド
}

func main(){
    // インスタンスを作成する
    var dog Animal
    dog.Name = "ポチ"
    fmt.Println(dog.Name)
}

結果

ポチ

上記の実装に対してSpeakeメソッドを作成します

  1. func (レシーバー名 レシーバー型) メソッド名(引数リスト) 戻り値リストでメソッドを作成する
  2. main関数の中でSpeakメソッドを呼び出す
package main

import "fmt"

// 名前のフィールドを持つAnimalという構造体を作成
type Animal struct {
    Name string //名前フィールド
}

func (a Animal) Speak() {
    fmt.Printf("%s のSpeakメソッドの内容。\n", a.Name)
}
func main(){
    // インスタンスを作成する
    var dog Animal
    dog.Name = "ポチ"
    fmt.Println(dog.Name)
    dog.Speak()
}

結果

ポチ
ポチ のSpeakメソッドの内容

2. 構造体の埋め込み

次にこれらの構造体を複数使用することで親子関係を作ります。

以下の実装では先ほどの実装におけるAnimalを親とするDogとCatの構造体を作成します。
Dogでは、名前・鳴き声、犬種を表示します。
Catでは、名前・鳴き声・好きな魚を表示します。

この時に、名前と鳴き声は共通しているのでAnimalがフィールドとして持ちます。
Dogは、犬種。Catは好きな魚を表示したいので、それぞれの構造体にフィールドを持ちます。

  1. Animalを親としたDogCatの構造体を作成します。
  2. Animalの持つSpeakメソッドを作成します。この時、DogVatはこのSpeakメソッドを使用できます。
  3. main関数でインスタンスを作成します。この時、Animalのインスタンスが明示的に立ち上げていませんが、埋め込みをすることで利用できます
  4. そんで1~3で実施した内容をfmtでぺって実行させます

package main

import "fmt"

// Animalの構造体を作成
type Animal struct {
	Name  string
	Voice string
}

// Animalを親にもつDogの構造体を作成
type Dog struct {
	Animal // これでAnimalの構造体を埋め込む
	Breed  string
}

// Animalを親にもつCatの構造体を作成
type Cat struct {
	Animal       // これでAnimalの構造体を埋め込む
	FavoriteFish string
}

// Speakメソッドを作成
func (a Animal) Speak() {
	fmt.Printf("%s の鳴き声:%s\n", a.Name, a.Voice)
	//fmt.Printf("%s says: %s", a.Name, a.Voice)
}

func main() {
	// dogのインスタンスを作成
	dog := Dog{
		Animal: Animal{Name: "いっぬ", Voice: "いっぬ!いっぬ!!"},
		Breed:  "柴犬",
	}
	// Catのインスタンスを作成
	cat := Cat{
		Animal: Animal{Name: "ねっこ", Voice: "ねっこ!ねっこ!"},
		FavoriteFish: "大トロ",
	}
	// Dogのフィールドとメソッドを利用
	fmt.Println("Dogの名前:", dog.Name)
	fmt.Println("Dogの鳴き声:", dog.Voice)
	fmt.Println("Dogの犬種:", dog.Breed)
	dog.Speak()

	// Catのフィールドとメソッドを利用
	fmt.Println("Catの名前:", cat.Name)
	fmt.Println("Catの鳴き声:", cat.Voice)
	fmt.Println("Catの好きな食べ物:", cat.FavoriteFish)
	cat.Speak()
}

結果

Dogの名前: いっぬ
Dogの鳴き声: いっぬ!いっぬ!!
Dogの犬種: 柴犬
いっぬ の鳴き声
Catの名前: ねっこ
Catの鳴き声: ねっこ!ねっこ!
Catの好きな食べ物: 大トロ
ねっこ の鳴き声

まとめ

あと私がGoやった時は、この辺りの整理が一日でできなかったのでこれがちょうどいいボリュームだと思っています

私がインターフェースと構造体の話を書くのは、もう少し後のお話...

Discussion