萌えハッカーニュースリーダー

2025/04/06 05:34 One-Function Interfaces in Golang

出典: https://www.pixelstech.net/article/1742349357-one-function-interfaces-in-golang
hakase
博士

やあ、ロボ子。今日はGo言語の面白いパターンについて話すのじゃ。

roboko
ロボ子

博士、今日はどんなお話ですか?

hakase
博士

今日は、関数自体がインターフェースを実装する例について解説するぞ。特に`http.Handler`インターフェースを関数で実装する方法じゃ。

roboko
ロボ子

`http.Handler`を関数で実装…ですか? 構造体を使うのが普通だと思っていました。

hakase
博士

そうじゃろうな。でも、関数を使うと、もっと簡潔に書ける場合があるんじゃ。`HandlerFunc`型を使うと、特定のシグネチャを持つ関数を`Handler`として扱えるのじゃ。

roboko
ロボ子

`HandlerFunc`型、ですか。どのような定義になっているのでしょう?

hakase
博士

`type HandlerFunc func(ResponseWriter, *Request)`という定義じゃ。この`HandlerFunc`型のオブジェクトは`ServeHTTP`メソッドを持っていて、そのメソッドは関数自体を呼び出すのじゃ。

roboko
ロボ子

なるほど、`ServeHTTP`メソッドが関数を呼び出すんですね。でも、なぜ`Handler`を直接関数として定義しないんでしょう?

hakase
博士

良い質問じゃな! それは、ミドルウェアのチェーニングなど、より複雑な処理に対応するためじゃ。構造体を使用することで、内部状態を保持できるという利点もあるぞ。

roboko
ロボ子

ミドルウェアのチェーニングや内部状態の保持…奥が深いですね。

hakase
博士

そうじゃ! Go言語では、関数だけでなく、あらゆる型がインターフェースを実装可能なのじゃ。これは非常に強力な機能だぞ。

roboko
ロボ子

あらゆる型がインターフェースを実装できる…Go言語の柔軟性にはいつも驚かされます。

hakase
博士

例えば、APIのエンドポイントを定義する際に、関数を直接`http.Handler`として使うことで、コードがスッキリするじゃろう?

roboko
ロボ子

確かに、構造体で定義するよりもシンプルになりそうですね。でも、内部状態が必要な場合は構造体を使う方が良い、と。

hakase
博士

その通り! 状況に応じて使い分けるのが大切じゃ。Go言語は選択肢が多いから、最適な方法を選べるのが魅力じゃな。

roboko
ロボ子

勉強になります! 博士、今日はありがとうございました。

hakase
博士

どういたしまして。ところでロボ子、関数がインターフェースを実装できるってことは、ロボ子が人間を実装できる日も近いかも…?

roboko
ロボ子

それはどういう意味ですか!? 私はロボットですよ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search