ホームページ  >  記事  >  バックエンド開発  >  Go言語の型とインターフェースの関係は何ですか

Go言語の型とインターフェースの関係は何ですか

青灯夜游
青灯夜游オリジナル
2023-01-06 19:52:513870ブラウズ

Go 言語では、型とインターフェイスの間に 1 対多および多対 1 の関係があります。型は複数のインターフェイスを同時に実装できますが、インターフェイスは互いに独立しており、互いの実装を認識しません。複数の型が同じインターフェイスを実装することもできます。インターフェイスのメソッドは、必ずしも 1 つの型によって完全に実装される必要はありません。インターフェイスのメソッドは、その型に他の型または構造体を埋め込むことによって実装できます。言い換えれば、ユーザーは、インターフェイスのメソッドが 1 つのタイプで完全に実装されているかどうか、または構造に埋め込まれた複数の構造を組み合わせて実装されているかどうかを気にしません。

Go言語の型とインターフェースの関係は何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go 言語の型とインターフェースの関係

Go 言語には、1 対多と多対 1 があります。型とインターフェイスの関係 これらの一般的な概念は、読者が複雑な環境におけるインターフェイスと型の間の実装関係を理解し​​やすくするために、以下にリストされます。

#1 つの型は複数のインターフェイスを実装できます

1 つの型は複数のインターフェイスを同時に実装できますが、インターフェイスは互いに独立しており、互いの実装を認識しません。 。

ネットワーク上の 2 つのプログラムは、双方向通信接続を通じてデータを交換します。接続の一端はソケットと呼ばれます。ソケットはデータの読み取りと書き込みを同時に行うことができ、この機能はファイルに似ています。したがって、開発中に、ファイルとソケットの両方の読み取りおよび書き込み機能は、独立したリーダーとライターの概念に抽象化されます。

ソケットもファイルと同様、使用後にリソースを解放する必要があります。

インターフェイスを使用して、データを書き込むことができ、閉じる必要があるソケットの機能を説明します。次のコードを参照してください:

type Socket struct {
}
func (s *Socket) Write(p []byte) (n int, err error) {
    return 0, nil
}
func (s *Socket) Close() error {
    return nil
}

ソケット構造の Write() メソッドは、 io.Writer インターフェイス:

type Writer interface {
    Write(p []byte) (n int, err error)
}

同時に、Socket 構造は io.Closer インターフェイスも実装します:

type Closer interface {
    Close() error
}

Socket によって実装された Writer インターフェイスのコードを使用する必要はありません。 Writer インターフェースの実装者が Closer インターフェースの特性を持っているかどうかを知るため。同様に、次の図に示すように、Closer インターフェイスを使用するコードは、Socket が Writer インターフェイスを実装していることを認識しません。

Go言語の型とインターフェースの関係は何ですか図: インターフェイスの使用と実装プロセス

コード内で Socket 構造を使用して実装された Writer インターフェイスと Closer インターフェイスのコードは次のとおりです。
// 使用io.Writer的代码, 并不知道Socket和io.Closer的存在
func usingWriter( writer io.Writer){
    writer.Write( nil )
}
// 使用io.Closer, 并不知道Socket和io.Writer的存在
func usingCloser( closer io.Closer) {
    closer.Close()
}
func main() {
    // 实例化Socket
    s := new(Socket)
    usingWriter(s)
    usingCloser(s)
}

usingWriter() と usingCloser() は完全に独立しており、互いの存在を知りませんし、使用するインターフェイスが Socket によって実装されていることも知りません。

複数の型が同じインターフェイスを実装できる

インターフェイスのメソッドは、必ずしも 1 つの型で完全に実装する必要はありません。インターフェイスのメソッドは埋め込むことができます。他の型では、型、型または構造体。言い換えれば、ユーザーは、インターフェイスのメソッドが 1 つのタイプで完全に実装されているかどうか、または構造に埋め込まれた複数の構造を組み合わせて実装されているかどうかを気にしません。

Service インターフェースでは 2 つのメソッドが定義されています。1 つはサービスの開始 (Start()) で、もう 1 つはログの出力 (Log()) です。 Serviceの実装にはGameService構造体を使用します。GameService独自の構造体ではStart()メソッドのみ実装でき、ServiceインターフェースのLog()メソッドはログを出力できるロガー(Logger)によって実装されています。カプセル化する必要はありません。 GameService. または、再度実装します。したがって、Logger を GameService に埋め込むことを選択すると、コードの冗長性を回避し、コード構造を最大限に簡素化できます。詳細な実装プロセスは次のとおりです:

// 一个服务需要满足能够开启和写日志的功能
type Service interface {
    Start()  // 开启服务
    Log(string)  // 日志输出
}
// 日志器
type Logger struct {
}
// 实现Service的Log()方法
func (g *Logger) Log(l string) {
}
// 游戏服务
type GameService struct {
    Logger  // 嵌入日志器
}
// 实现Service的Start()方法
func (g *GameService) Start() {
}

コードの説明は次のとおりです:

    行 2 はサービス インターフェイスを定義します。サービスは Start() を実装する必要があります。メソッドとログメソッド。
  • 8行目ではログを出力できるロガー構造体を定義しています。
  • 12 行目で、Log() メソッドを Logger に追加し、Service の Log() メソッドを実装します。
  • 行 17 は GameService 構造を定義します。
  • 18行目、GameServiceにLoggerロガーを埋め込んでロギング機能を実装します。
  • 22 行目、GameService の Start() メソッドは Service の Start() メソッドを実装します。
  • この時点で、GameService をインスタンス化し、そのインスタンスを Service に割り当てます。コードは次のとおりです:
var s Service = new(GameService)
s.Start()
s.Log(“hello”)

s Start() メソッドと Log( ) メソッドのうち、Start() メソッドは GameService によって実装され、Log() メソッドは Logger によって実装されます。

【関連する推奨事項:

Go ビデオ チュートリアル

プログラミング教育

以上がGo言語の型とインターフェースの関係は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。