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