0
0

Goのinterfaceを覚えよう!

Posted at

はじめに

初めまして。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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0