【Go言語】インターフェースが実装されているか調べる方法

Goにはimplementsがない

他の言語であればインターフェースを実装するときはimplementsなどのように明示して実装します。

phpであればこのようにインターフェスを実装するときはimplementsを使います。

<?php

// インターフェイス 'Template' を宣言する
interface Template
{
    public function setVariable($name, $var);
    public function getHtml($template);
}

// インターフェイスを実装する。
class WorkingTemplate implements Template
{
    private $vars = [];
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
  
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }
 
        return $template;
    }
}

しかしGo言語にはこれがないので、実装されているかいないかがわかりません。 ただ、実装されているか調べることができます。

実装されているか調べる

以下のようにインターフェースがあるとします。

type Animal interface {
    MakeSound() string
}

type Cat struct{}

func (c Cat) MakeSound() string {
    return "Meow"
}

type Lion struct{}

CatはAnimalを実装しており、Lionは実装していません。 このとき以下のコードを入力すると下のコードはコンパイラエラーになります。

var _ Animal = Cat{}
var _ Animal = Lion{} // エラー

これはLionをAnimal型の変数には代入できない、すなわち実装していないため代入できないからです。 そのためこのコードを利用すれば実装しているか実装していないかをエラーで確認することができます。