Go 言語の最も重要な機能は次のとおりです: 1. 同時プログラミング; Go 構文での同時プログラミングは非常に簡単で、コールバックを処理する必要がなく、スレッドの切り替えに注意を払う必要もありません。シンプル&ナチュラルがキーワード。 2. 自動ガベージ コレクション: プログラマはメモリのリサイクルを考慮する必要がなくなりましたが、言語機能にはメモリを再利用するためのガベージ コレクタが用意されています。 3. 豊富な組み込みタイプ。 4. 関数の戻り値が複数ある。 5. エラー処理。 6. 匿名関数とクロージャ。 7. タイプとインターフェース。 8. リフレクションにより、開発者は型自体を第一級の値型として扱うことができます。 9. 言語の対話性。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
#Go 言語の最も重要な機能は次のとおりです:
#振り返り
言語の対話性
本日は、同時実行性 プログラミングはプログラマにとっての基本的なスキルとなっており、さまざまな技術コミュニティで関連するディスカッション トピックが数多く見られます。この場合、Go 言語は非常に大胆で、特徴的ではなく、基本的にすべてを同時実行することを実行しており、Goroutine を使用して実行時に main.main エントリ関数を含むすべてを実行します。 Goroutine は Go の最も重要な機能であると言えます。コルーチンのようなアプローチを使用して同時ユニットを処理しますが、ランタイム レベルでより詳細な最適化も実行します。これにより、構文的に並行プログラミングが非常に簡単になり、コールバックを処理する必要がなく、スレッドの切り替えに注意を払う必要もなく、キーワードが 1 つだけで、シンプルかつ自然です。
Go 言語は、同時プログラミングの点で、ほとんどの言語よりもはるかにシンプルです。これは、その最大のハイライトの 1 つであり、高同時実行性と高パフォーマンスのシナリオに参入するための重要な交渉材料です。未来。
従来のマルチプロセスやマルチスレッドとは異なり、golang の同時実行単位は goroutine と呼ばれるコルーチンです。ロックは共有データのシナリオで GC と組み合わせて使用されるため、その同時実行パフォーマンスは非同期多重 IO モデルほど良くない場合があります。したがって、ほとんどの言語と比較して、golang の同時プログラミングは同時実行パフォーマンスよりも単純です。さらなるセールスポイント。
今日のマルチコア時代では、同時プログラミングの重要性は自明です。もちろん、多くの言語はマルチスレッドおよびマルチプロセスプログラミングをサポートしていますが、残念ながら、その実装と制御はそれほど簡単で楽しいものではありません。 Golang との違いは、言語レベルがコルーチン (ゴルーチン) の同時実行をサポートしていることです (コルーチンはマイクロスレッドとも呼ばれ、スレッドに比べて軽量、低コスト、高パフォーマンスです)。操作は非常に簡単です。キーワード (go) コルーチンの開始に使用され、同じマシン上で数千のコルーチンを開始できます。コルーチンは軽量スレッドとして理解されることが多く、1 つのスレッドに複数のコルーチンを含めることができ、共有ヒープはスタックを共有しません。コルーチンは通常、アプリケーションによって明示的にスケジュールされ、コンテキストの切り替えをカーネル層まで行う必要がないため、はるかに効率的です。一般にコルーチン間の同期通信はありませんが、golang のコルーチン間の通信には 2 種類あります: 1) グローバル変数ミューテックス ロックを使用してデータ共有を実現する共有メモリ タイプ、2) 独自のチャネル メカニズムを使用するメッセージ パッシング タイプ非同期通信用。
JAVA のマルチスレッドと GO のコルーチン実装を比較すると、明らかにより直接的でシンプルです。シンプルで効率的な方法で問題を解決するのが GO の魅力であり、GO というキーワードはおそらく GO 言語の最も重要な象徴です。
高い同時実行性が Golang 言語の最大のハイライト
メモリ リサイクル (GC)
C から C へC、プログラムのパフォーマンスの観点から、これら 2 つの言語を使用すると、プログラマはメモリの適用と解放などを含むメモリを自分で管理できます。ガベージ コレクション メカニズムがないため、C/C は非常に高速に実行されますが、プログラマはメモリ使用量を注意深く考慮する必要があります。なぜなら、ほんの少しの不注意でも、リソースを浪費する「メモリ リーク」やプログラムのクラッシュを引き起こす「ワイルド ポインタ」につながる可能性があるためです。C 11 では後にスマート ポインタの概念が使用されましたが、プログラマは依然として非常に慎重にそれを使用する必要があります。その後、プログラム開発の速度とプログラムの堅牢性を向上させるために、Java や C# などの高級言語では GC メカニズムが導入されました。つまり、プログラマはメモリのリサイクルを考慮する必要がなくなりましたが、言語機能は、メモリをリサイクルするためのガベージ コレクターを提供します。ただし、その後はプログラムの実行効率が低下する可能性があります。
GC プロセスは次のとおりです。まずワールドを停止し、すべてのオブジェクトをスキャンして生きているかどうかを確認し、ビットマップ領域でリサイクル可能なオブジェクトにマークを付けます。その後すぐにワールドを開始し、サービスを再開し、同時に開始します。メモリを再利用するための特別なゴロンチン。再利用のために空きリストに置かれ、物理的に解放されません。物理的な解放は専用のスレッドによって定期的に実行されます。
GC のボトルネックは、活性度を判断するために毎回すべてのオブジェクトをスキャンする必要があることです。収集するオブジェクトが増えるほど、速度が遅くなります。経験値では、100,000 個のオブジェクトをスキャンするのに 1 ミリ秒かかるため、より少ないオブジェクトを使用したソリューションを使用するようにしてください。たとえば、リンク リスト、マップ、スライス、配列を同時に保存することを検討します。リンク リストの各要素とマップはオブジェクトであり、スライスまたは配列はオブジェクトであるため、スライスまたは配列は GC に適しています。
GC のパフォーマンスは、バージョンが常に更新されるため、継続的に最適化される可能性があります。これについては注意深く調査していません。チームには HotSpot 開発者がいます。そのため、世代別リサイクルなど、jvm gc の設計アイデアから学ぶ必要があります。 、セーフポイントなど。
より豊富な組み込み型 キーはビルトインです。マップやスライスなどの一般的なデータ型はビルトインされており、デフォルトで含まれています。自分で追加する必要はありません。
複数の関数の戻り値C、C (その他の高級言語を含む) では、複数の関数の戻り値はサポートされていません。しかし、この関数は実際に必要であるため、C 言語では通常、戻り値は構造体として定義されるか、関数のパラメーター参照の形式で返されます。 Go言語では、新しいタイプの言語として、強力な言語として位置づけることが目標であり、当然この需要を満たすことを諦めることはできないため、関数からの複数の戻り値をサポートする必要があります。
関数を定義するとき、入力パラメータの後に (a, b, c) を追加できます。これは、3 つの戻り値 a、b、c があることを意味します。この機能は、Python などの多くの言語で利用できます。
この構文上のシュガー機能には実用的な意味があります。たとえば、インターフェースがトリプレット (errno、errmsg、data) を返すように要求することがよくあります。戻り値が 1 つだけ許可されているほとんどの言語では、Put のみを使用できます。トリプルをマップまたは配列に変換して返します。受信側も、戻り値にトリプルが含まれていることを確認するコードを記述する必要があります。複数の戻り値が許可されている場合、関数定義レベルで直接強制的に、コードをより簡潔かつ安全に。
言語の対話性言語の対話性とは、この言語が他の言語と対話できるかどうか (他の言語でコンパイルされたライブラリを呼び出すなど) を指します。
C モジュールのほとんどは Go 言語 (ここでは Cgo と呼ばれます) で直接再利用されます。Cgo を使用すると、開発者は C 言語コードを混合して作成でき、Cgo ツールはこれらの混合された C コードを抽出して C 関数のコードを生成できます。ラッパーコードを呼び出します。開発者は基本的に、Go 言語と C 言語の間の境界がどのように交差するかを完全に無視できます。
Golang は C プログラムと対話できますが、C と対話することはできません。 1) まず c を動的ライブラリにコンパイルし、次に go から c コードの一部を呼び出します。c コードは、dlfcn ライブラリを通じて動的ライブラリを動的に呼び出します (LD_LIBRARY_PATH をエクスポートすることを忘れないでください)。2) swig (試したことはありません)
例外処理golang は、try...catch などの構造化例外ソリューションをサポートしていません。コードの量が増加し、どんなに小さくても例外をスローする悪用になります。 golang が提唱する例外処理メソッドは次のとおりです。
通常の例外: 呼び出し先はエラー オブジェクトを返し、呼び出し元はエラー オブジェクトを決定します。
重大な例外: 割り込みパニック (0 による除算など) を指し、遅延...回復...パニック メカニズムを使用してキャプチャおよび処理されます。重大な例外は通常、golang によって内部的に自動的にスローされ、ユーザーが積極的に例外をスローする必要がなく、従来の try...catch があらゆる場所に記述される状況を回避します。もちろん、ユーザーは、panic('xxxx') を使用して積極的にスローすることもできますが、これにより、このメカニズムが構造化例外メカニズムに退化します。
リフレクションGo 言語は、変数の値を更新および確認するメカニズム、変数のメソッドを呼び出すメカニズム、および変数は組み込み操作をサポートしますが、これらの変数の具体的な型はコンパイル時には不明ですが、このメカニズムはリフレクションと呼ばれます。リフレクションを使用すると、型自体を第一級の値型として扱うこともできます。
リフレクションとは、プログラムの実行中にプログラム自体にアクセスして変更する機能を指します。プログラムがコンパイルされると、変数はメモリ アドレスに変換され、変数名は実行可能ファイルには書き込まれません。コンパイラによって部分的に処理されるため、プログラム自身の情報を取得することはできません。
リフレクションをサポートする言語は、プログラムのコンパイル中にフィールド名、型情報、構造情報などの変数のリフレクション情報を実行可能ファイルに統合し、プログラムにインターフェイスを提供できます。リフレクション情報にアクセスすると、プログラムの実行中に型に関するリフレクション情報を取得し、それらを変更できるようになります。
C/C 言語はリフレクション関数をサポートしておらず、typeid を通じて非常に弱いプログラム実行時の型情報しか提供できません。Java や C# などの言語はすべて完全なリフレクション関数をサポートしており、動的言語はLua や JavaScript と同様、その構文自体により、コードは実行時にプログラム自身の値と型情報にアクセスできるため、リフレクション システムは必要ありません。
Go 言語プログラムのリフレクション システムは、実行可能ファイル空間またはパッケージ内のすべての型情報を取得することはできません。ソース コードを分析するには、標準ライブラリ内の対応する字句、構文パーサー、および抽象構文ツリー (AST) を使用する必要があります。この情報は、スキャンの実行後に取得されます。
【関連する推奨事項: Go ビデオ チュートリアル 、プログラミング教育 】
以上がGo言語の最も重要な機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。