【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型の変数には代入できない、すなわち実装していないため代入できないからです。 そのためこのコードを利用すれば実装しているか実装していないかをエラーで確認することができます。