Go言語学習9日目:インターフェースってなに?文系SEが“使いどころ”を考えてみた

Go言語学習もついに9日目に入りました!

今日のテーマは 「Methods and Interfaces」セクションの後半にあたる「interface(インターフェース)」です。

今までは、コチラ

kunio-ud-all.com


インターフェースとは何か?

オブジェクト指向で言うところの「共通の機能を持たせる型の“契約”」という概念に近いですが、
Goはとても柔軟&シンプルにできていますね。


インターフェースの実例:しゃべる型たち

前も少し書きましたが、また書くのも!

package main

import "fmt"

// インターフェース定義
type Speaker interface {
    Speak() string
}

// 構造体その1
type Person struct {
    Name string
}

func (p Person) Speak() string {
    return "こんにちは、" + p.Name + "です!"
}

// 構造体その2
type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return d.Name + ":ワン!"
}

// 共通関数
func greet(s Speaker) {
    fmt.Println(s.Speak())
}

func main() {
    greet(Person{Name: "たろう"})
    greet(Dog{Name: "ポチ"})
}

Goでは 「このメソッドを持ってるだけで、そのインターフェースを満たしてる」 とみなされます。
つまり、明示的な宣言(implements)とかは一切不要! ってのがいいですよね。 必要なだけ書く!的な。


「なぜ interface を使うのか?」

大きな理由は3つあります👇
  1. 異なる型に対して共通の処理が書ける
  2. 実装を意識せずに機能だけに注目できる
  3. テストやモック作成がしやすくなる

たとえば「ログ出力」「保存」「通信」などの処理で、
いろんな型(ファイル・DB・API)が同じ操作を提供してくれると便利ですよね。


実務で使われるインターフェースの例

Goの標準ライブラリにもインターフェースはたくさん使われているようです。

type Reader interface {
    Read(p []byte) (n int, err error)
}

これは io.Reader という超重要なインターフェース。
ファイルでも、ネットワークでも、標準入力でも、「ReadさえできればReader」です。

💡 ファイルでもネットでも同じように扱えるのは、interfaceがあるから!


interface とポリモーフィズム(多態性)

いきなり難しそうな言葉が出てきましたが…
これは「いろんな型が同じインターフェースとして扱える」という考え方のこと。

Goでは「型が違っても、同じメソッドを持っていれば同じように扱える」ので、
interface = シンプルなポリモーフィズムとも言えます!


今日のまとめ

Go言語9日目の学習ポイントまとめ
  • interface は「このメソッドを持ってるならOK」なルール
  • 明示的な宣言不要!勝手に“はまる”のがGo流
  • 異なる型でも同じ処理ができる=ポリモーフィズム
  • 実務でも標準ライブラリで interface がたくさん使われている(例:io.Reader)
  • 文系SEでも“しゃべれる型にマイクを渡す”イメージで理解しやすい!

インターフェースを活かした設計へ?

インターフェースの基本がわかったら、
抽象的な処理を書いて、あとから具体的な実装を渡す」という書き方にも挑戦してみたいですね!

たとえば:

  • 複数の保存先(ファイル、メモリ、DB)に同じSave関数で保存する
  • モックを使ったテストの準備

など、interfaceを使うことでコードの柔軟性がグッと上がる世界が。。。だといいな。