Goodrichが、Rubyプログラマー向けにGo言語のinterfaceとWeb.goを紹介しています。1回目はまずは、interfaceから。Inheritance継承は些細な修正も実装が面倒になり、コードが複雑になる可能性があります。Horseクラスと二つのサブクラス、GallopingHorseとSadHorseがあったとします。(その二つはステートの違いだけでなく、まったく性格の違うサブクラスかもしれません。)sadな雰囲気で、gallopをしているhorseがいる場合はどうするか?それぞれのクラスである振る舞いがロックアップされることになるかもしれません。type間の関係を考慮しなくてはいけなくなるので、コードに融通がきかなくなるという問題もでます。approach.”とあり、そうするとGoではどのようにしているのか?Goではinterfaceを使います。Rubyはinterfaceの概念はもってませんが、それをワークするようにはできます。本質的に、interfaceはcontractのようなもの。interfaceは、eat()とsleep()メソッドを要求します。Ruby的なコードを書いて説明しましょう。interfaceを実装してなければ、Rubyはこのコードを実行しないふりをしましょう。interfaceを満たすものだけを期待するメソッドを持つことになります。Horseなのか、Duckなのか、Personなのかは気にしません。本当のRubyは動的型付言語なので、interfaceは異なるかたちで適用されます。Animalがeatメソッド、sleepメソッドを持ってるかどうかに関わらず、コードはbyteコードに正しくコンパイルされます。Goは静的型付言語なので、interfaceはコンパイルの際に検証されます。理論はここまでにして、サンプルをつくりましょう。Animalsまずは、何らかのオブジェクトが必要になります。自らをHorseとしましょう。structは、「新しい型をつくってます。それをHorseと呼んで、このようなstructにしなくてはいけません。array等)の集まり。Rubyのstructも、getterとsetterメソッドを付与してくれることを除いて、似ている。そのstructは、Horseの名前という情報を持っている。(Goにおいては、データの型は、データ名の後にくることに注意。)次にHorseのメソッドを定義しよう。{}どのようにメソッドを定義しているか見てほしい。Rubyのようにクラス宣言ブロックの中でなく、Goではstructの外で宣言されています。*Horse)が置かれている。これによってコンパイラは、Horseクラスで呼び出せるメソッドがあるとわかり、このメソッドに対するHorseのインスタンスであるhが提供される。interfaceを追加してみよう。{}数行のコードだが、全てのAnimalの振る舞い(eatとsleep)を定義している。Goのinterfaceは明示的には実装されない。Javaを書いたことがあれば、このようなコードは見たことがあるだろう。AnimalGoでは必要とされるメソッドがあれば、interfaceは自動的に実装されている。interfaceを自動的に満たしていることになる。話しを先に進める前に、Georgeという名前のHorseのインスタンスを作成しよう。george.Eat()}まず、nameというフィールドをNameに変更。大文字ではじまるフィールドはpublicの意味。mainメソッドに関しては、Horseへのリファレンスをするのに、newビルトインを使った。最後に、名前をつけて、EatとSleepメソッドを呼び出した。a.Sleep()}GeorgeにおいてFullDay(george)を呼び出せば、以前と同じアウトプットがくるはず。これによって、Goでどのようにinterfaceが機能するかわかったと思う。データストラクチャーを決めて、メソッドを追加すると、interfaceが自動的に定義される。これでコードベースがフレキシブルになり、必要あらば簡単に修正できるようになる。