私が心配するのをやめて Go インターフェースを愛するようになった方法

Mary-Kate Olsen
リリース: 2024-10-24 08:19:29
オリジナル
182 人が閲覧しました

こんにちは、Go 初心者の皆さん (または、Gopher 見習いと言うべきでしょうか?)! ?
インターフェイスは、誰もが話題にし続ける神秘的で魔法のようなものの 1 つであるように見えましたが、誰も理解できる方法で実際に説明しませんでした。 「これはポリモーフィズムに似ていますが、より単純です」と彼らは言いました。 「それは契約のようなものだ」と彼らは主張した。しかし、実装しようとするたびに、コードは「一体何をしているんだ、人間?」という目で見られることになります。 ?

しかし、それはその時でした。現在、インターフェースと私はずっと良い関係にあります。私は、初期の混乱を避けるためにここにいます。 Go インターフェイスについて頭を悩ませている場合は、コーヒー (または紅茶) を飲みながら、頭痛を除いて、一度に 1 ステップずつ説明してみましょう。 ?
それでは、インターフェイスとは一体何なのでしょうか?

一番上から始めましょう。 Go では、インターフェイスは基本的に動作を定義する方法ですが、その動作方法の詳細にとらわれることはありません。あなたが工場の上司で、機械がどのように機能するかは気にしていないと想像してください。製品を生産できるかどうかだけを気にする必要があります。それが Go インターフェースのようなものです。何が起こる必要があるかを定義しますが、それをどのように行うべきかは定義しません。

たとえば、私たちが動物を扱っていると仮定してみましょう (はい、Go は動物を扱います。ここで私と一緒にいてください)。どの動物も鳴き声を発することは知っていますが、それがどのように起こるかはあまり気にしません。犬は吠え、猫は鳴き、アヒルは鳴きます。次のようなインターフェースを定義できます:

type Animal interface {
    Sound() string
}

ログイン後にコピー
ログイン後にコピー

How I Stopped Worrying and Learned to Love Go Interfaces
これは何ですか? 「おい、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!
}

ログイン後にコピー
ログイン後にコピー

ここで何が起こっているのですか?

  1. 1 つのメソッドを持つ Animal インターフェースを定義します: Sound() ?.
  2. 次に、Dog と Cat の 2 つのタイプを作成し、それぞれに固有の Sound() メソッドを与えます。
  3. main() 関数で、Animal インターフェースを満たすものをすべて保持できる変数 myPet を作成します。
  4. まず、犬を割り当てて、ドーン!うちの犬は「ワン!」と吠えます。 ?
  5. 次に、猫を割り当てます。どうなるでしょうか? 「ニャー!」と鳴きます。 ?

Go インターフェイスの魔法が実際に発揮されるのはここからです ??:
型に必要なメソッドがある限り、その型はインターフェイスを満たします。 「犬が動物を実装する」と明示的に言う必要はありません。Go はそれを自分で理解できるほど賢いのです。 ??

なぜインターフェースを気にする必要があるのですか?

How I Stopped Worrying and Learned to Love Go Interfaces
私もあなたと同じレベルにさせてください。最初は、「なぜわざわざこんなことをするの?」と思いました。メソッドを直接記述するだけです!」しかし、信じてください。特にコードベースが成長し始めたときは、インターフェースをすぐに理解する必要があるでしょう。

その理由は次のとおりです:

  1. 柔軟性: インターフェイスにより、コードがより柔軟になります。インターフェイスを満たす限り、あるタイプを別のタイプに交換できます。役職ではなくスキルに基づいて人を雇用するようなものです。
  2. ポリモーフィズム: 同じインターフェイスを実装している場合、異なる型を均一に扱うことができます。これがインターフェイスを非常に強力にする理由です。つまり、どのテレビでも動作するユニバーサル リモコンがあるようなものです。

  3. クリーンなコード: インターフェイスを使用すると、よりクリーンでモジュール化されたコードを作成できます。動作を定義し、型に独自の実装を処理させます。

複数の方法でも問題ありません!

さらにレベルアップしてみましょう。形状を操作するシステムを構築していて、円や長方形などのさまざまな形状の面積と周囲長の両方を計算したいとします。マルチメソッドインターフェースに入りましょう!

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 のインターフェースの魔法をどんどん身につけてください。やがて、技術カンファレンスでのヨガインストラクターと同じくらいクリーンで柔軟なコードを作成できるようになります。

ゴーファーの皆さん、コーディングを楽しんでください!インターフェースがシンプルになり、構造体が常に実装されますように。 ?✌️

How I Stopped Worrying and Learned to Love Go Interfaces

以上が私が心配するのをやめて Go インターフェースを愛するようになった方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!