Go言語の型とインターフェースの関係は何ですか
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 }
type Writer interface { Write(p []byte) (n int, err error) }
type Closer interface { Close() error }
図: インターフェイスの使用と実装プロセス
// 使用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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

VSCODEユーザーのGolang Generic Function Typeの制約の自動削除は、VSCODEを使用してGolangコードを書くときに奇妙な問題に遭遇する可能性があります。いつ...
