anomalocaristan’s blog

JSやGo、設計などについて学んだことをメモしておくサイトです

interface実装の省略

概要

インターフェースに構造体渡して紐付けたいけど、構造体をジェネレートしてインターフェースにぶっこむのが面倒なんじゃ〜って時の方法。

Before

type template interface {
  Sleep()
}

type BeginnerEngineer struct {
  name string
  age  int
}

func (b *BeginnerEngineer) Sleep() {
  fmt.Prinln("zzzzz......")
}

func GenerateBeginner(name string, age int) *BeginnerEngineer {
  return &BegineerEngineer{
    name :name,
    age: age,
}

func main() {
  var templateInterface := GenerateBeginnerEngineer("シド・ガーロンド", 30)

  templateInterface.Sleep()
  // => zzzzz......
}

After

type template interface {
  Sleep()
}

type BeginnerEngineer struct {
  name string
  age  int
}

func (b *BeginnerEngineer) Sleep() {
  fmt.Prinln("zzzzz......")
}

// ここで、戻り値を Struct => interface に変更している
func GenerateBeginner(name string, age int) template {
  return &BegineerEngineer{
    name :name,
    age: age,
}

func main() {
  var beginnerEngineer := GenerateBeginnerEngineer("シド・ガーロンド", 30)

  beginnerEngineer.Sleep()
  // => zzzzz......
}

変わったこと

interface呼び出し→構造体のインスタンス化→interfaceに構造体インスタンスを突っ込む
という流れから
構造体のインスタンス化(戻り値がインターフェース) に省略された。

やってることは同じだけど、GenerateBeginner()メソッド1人でインターフェースの実装もやってくれるから気持ちすっきりする気がする。