はじめに
初めまして。Goを始めて2か月の新人プログラマーです。このアカウントでは、自分が詰まった箇所を後で見返せるように
メモとして残しておきます。
今回はinterface編です!
そもそものinterfaceの定義
公式情報によると、interfaceとは、「メソッドのシグネチャの集まり」と書かれています。なんのこっちゃですよね。
要約すると、そのメソッドの集まりを実装した値を、interface型の変数へ
持たせることができるということです。
実際に使ってみた
main.go
package main
import "fmt"
type I interface {
M()
}
type T struct {
S string
}
func (t T) M() {
fmt.Println(t.S)
}
func main() {
var i I = T{"hello"}
i.M()
}
これは公式からコピペしただけのコードです。
このコードを実行すると、helloが出力されます。
なにが行われているかまでは書かれていないので、詳しく見ていきましょう。
コードの解説
まず最初に、Iという名前のinterfaceを定義し、M()というメソッドを持つことを 要求しています。これは具体的な実装をもたずに、メソッドのシグネチャのみを 指定しています。*シグネチャとは、メソッド名、引数、戻り値の型等の組み合わせのことです。 その次は、Sというフィールド(文字列型)をもつ、Tという構造体がありますね。 このT構造体は、先ほどのM()というメソッドを実装しています。そしてこのメソッドは、Sの内容を出力するように構築されています。
main関数では、T{"hello"} という具体的な型のインスタンスを I 型の変数 i に代入しています。i.M() を呼び出すことで、T の M() メソッドが実行され、"hello" が表示されます。
これ使う必要ある?
実際、わざわざinterface型を使わなくても1個ずつ書いていけばいいじゃん!そう思いますよね。でも、実際にプロジェクトに入るとinterface型のありがたみを知ることになります。(これはおおマジです)
理由を説明していきますね。
まず、一番のメリットとしては、重要メソッドの実装漏れを防止できることだと私は思っています。インターフェースを実装する具体的な型は、インターフェース内で定義されたメソッドを必ず実装しなければなりません。そのため、コードの信頼性を高めることが出来ます。
他にも、同じインターフェースを実装する異なる型を、共通のインターフェース型として扱えるため、柔軟性が格段に向上したり、具体的な実装を後回しにできたり様々なメリットが存在します。
以上が、interface型の説明になります。皆さんも、適切な状況でinterfaceを活用することで、柔軟で保守性の高いコードを作成していきましょう!
参考文献(コード提供):https://go-tour-jp.appspot.com/methods/9