こんにちは、Go 初心者の皆さん (または、Gopher 見習いと言うべきでしょうか?)! ?
インターフェイスは、誰もが話題にし続ける神秘的で魔法のようなものの 1 つであるように見えましたが、誰も理解できる方法で実際に説明しませんでした。 「これはポリモーフィズムに似ていますが、より単純です」と彼らは言いました。 「それは契約のようなものだ」と彼らは主張した。しかし、実装しようとするたびに、コードは「一体何をしているんだ、人間?」という目で見られることになります。 ?
しかし、それはその時でした。現在、インターフェースと私はずっと良い関係にあります。私は、初期の混乱を避けるためにここにいます。 Go インターフェイスについて頭を悩ませている場合は、コーヒー (または紅茶) を飲みながら、頭痛を除いて、一度に 1 ステップずつ説明してみましょう。 ?
それでは、インターフェイスとは一体何なのでしょうか?
一番上から始めましょう。 Go では、インターフェイスは基本的に動作を定義する方法ですが、その動作方法の詳細にとらわれることはありません。あなたが工場の上司で、機械がどのように機能するかは気にしていないと想像してください。製品を生産できるかどうかだけを気にする必要があります。それが Go インターフェースのようなものです。何が起こる必要があるかを定義しますが、それをどのように行うべきかは定義しません。
たとえば、私たちが動物を扱っていると仮定してみましょう (はい、Go は動物を扱います。ここで私と一緒にいてください)。どの動物も鳴き声を発することは知っていますが、それがどのように起こるかはあまり気にしません。犬は吠え、猫は鳴き、アヒルは鳴きます。次のようなインターフェースを定義できます:
type Animal interface { Sound() string }
これは何ですか? 「おい、Animal と呼ばれたい型は Sound() メソッドを持たなければならない」という単なる契約です。それでおしまい!奇妙な魔術は必要ありません。
コードを見せてください! ???
非常に単純な例を取り上げて、実際にどのように機能するかを見てみましょう。いくつかの動物を作成し、話させます。
package main import "fmt" // The Animal interface type Animal interface { Sound() string } // Define a Dog type Dog struct{} func (d Dog) Sound() string { return "Woof!" } // Define a Cat type Cat struct{} func (c Cat) Sound() string { return "Meow!" } func main() { // Our Animal variable can hold any type that satisfies the interface var myPet Animal // myPet is now a Dog myPet = Dog{} fmt.Println(myPet.Sound()) // Outputs: Woof! // myPet is now a Cat myPet = Cat{} fmt.Println(myPet.Sound()) // Outputs: Meow! }
ここで何が起こっているのですか?
Go インターフェイスの魔法が実際に発揮されるのはここからです ??:
型に必要なメソッドがある限り、その型はインターフェイスを満たします。 「犬が動物を実装する」と明示的に言う必要はありません。Go はそれを自分で理解できるほど賢いのです。 ??
なぜインターフェースを気にする必要があるのですか?
私もあなたと同じレベルにさせてください。最初は、「なぜわざわざこんなことをするの?」と思いました。メソッドを直接記述するだけです!」しかし、信じてください。特にコードベースが成長し始めたときは、インターフェースをすぐに理解する必要があるでしょう。
その理由は次のとおりです:
ポリモーフィズム: 同じインターフェイスを実装している場合、異なる型を均一に扱うことができます。これがインターフェイスを非常に強力にする理由です。つまり、どのテレビでも動作するユニバーサル リモコンがあるようなものです。
クリーンなコード: インターフェイスを使用すると、よりクリーンでモジュール化されたコードを作成できます。動作を定義し、型に独自の実装を処理させます。
複数の方法でも問題ありません!
さらにレベルアップしてみましょう。形状を操作するシステムを構築していて、円や長方形などのさまざまな形状の面積と周囲長の両方を計算したいとします。マルチメソッドインターフェースに入りましょう!
type Animal interface { Sound() string }
空のインターフェース (インターフェース{})
ああ、もう終わったと思った????いいえ!空のインターフェース、interface{} についてもう少し詳しく見てみましょう。これは Go の言い方で「どんな型でも保持できる」ということです。これは、文字列、数値、構造体など、何でも入れられる自由に使えるボックスのようなものです。
package main import "fmt" // The Animal interface type Animal interface { Sound() string } // Define a Dog type Dog struct{} func (d Dog) Sound() string { return "Woof!" } // Define a Cat type Cat struct{} func (c Cat) Sound() string { return "Meow!" } func main() { // Our Animal variable can hold any type that satisfies the interface var myPet Animal // myPet is now a Dog myPet = Dog{} fmt.Println(myPet.Sound()) // Outputs: Woof! // myPet is now a Cat myPet = Cat{} fmt.Println(myPet.Sound()) // Outputs: Meow! }
空のインターフェイスは、どのような型を扱うかが事前にわからない状況 (API やライブラリなど) でよく使用されます。これは、Go 版のワイルドカードのようなものです。
インターフェースを採用する
Go インターフェイスの学習は、最初は迷路を進むように感じるかもしれませんが、基本を理解すると、柔軟で再利用可能でクリーンなコードのまったく新しい世界が開かれます。だから、恐れずに飛び込んでみてください!
簡単に始めて、小さなサンプルで遊んで、Go のインターフェースの魔法をどんどん身につけてください。やがて、技術カンファレンスでのヨガインストラクターと同じくらいクリーンで柔軟なコードを作成できるようになります。
ゴーファーの皆さん、コーディングを楽しんでください!インターフェースがシンプルになり、構造体が常に実装されますように。 ?✌️
以上が私が心配するのをやめて Go インターフェースを愛するようになった方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。