Go 言語では、型とインターフェイスの間に 1 対多および多対 1 の関係があります。型は複数のインターフェイスを同時に実装できますが、インターフェイスは互いに独立しており、互いの実装を認識しません。複数の型が同じインターフェイスを実装することもできます。インターフェイスのメソッドは、必ずしも 1 つの型によって完全に実装される必要はありません。インターフェイスのメソッドは、その型に他の型または構造体を埋め込むことによって実装できます。言い換えれば、ユーザーは、インターフェイスのメソッドが 1 つのタイプで完全に実装されているかどうか、または構造に埋め込まれた複数の構造を組み合わせて実装されているかどうかを気にしません。
このチュートリアルの動作環境: 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 インターフェイスを実装していることを認識しません。
図: インターフェイスの使用と実装プロセス
// 使用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() { }
コードの説明は次のとおりです:
var s Service = new(GameService) s.Start() s.Log(“hello”)
s Start() メソッドと Log( ) メソッドのうち、Start() メソッドは GameService によって実装され、Log() メソッドは Logger によって実装されます。
【関連する推奨事項:
Go ビデオ チュートリアル、プログラミング教育 】
以上がGo言語の型とインターフェースの関係は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。