Go言語学習もついに9日目に入りました!
今日のテーマは 「Methods and Interfaces」セクションの後半にあたる「interface(インターフェース)」です。
今までは、コチラ
インターフェースとは何か?
オブジェクト指向で言うところの「共通の機能を持たせる型の“契約”」という概念に近いですが、
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つあります👇
- 異なる型に対して共通の処理が書ける
- 実装を意識せずに機能だけに注目できる
- テストやモック作成がしやすくなる
たとえば「ログ出力」「保存」「通信」などの処理で、
いろんな型(ファイル・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を使うことでコードの柔軟性がグッと上がる世界が。。。だといいな。