1. goroutine とは何ですか?それを停止する方法はありますか?#
- goroutine は、特別な goroutine スレッドを使用して、関数またはメソッドの実行を並行して行います。 goroutine スレッドは標準スレッドよりも軽量であり、多くの Golang プログラムは数千の goroutine を同時に使用します。
- goroutine を作成するには、関数の宣言の前に go キーワードを追加します。
- goroutine を停止するには、シグナルチャネルに信号を送信します。 goroutine は、チェックが指示されたときにのみ応答するため、ロジックの位置(たとえば、for ループの先頭など)にチェックを含める必要があります。
2. 同期ロックの特徴とは何ですか?役割は何ですか?#
- Go 言語では、共有メモリを介した通信ではなく、通信を介した共有メモリを実現します。Go の CSP(Communicating Sequential Process)並行モデルは、goroutine とチャネルを使用して実現されます。
- Goroutine(コルーチン)が Mutex を取得すると、他の Goroutine(コルーチン)は待機する必要があります。 Mutex を解放するまで、RWMutex は書き込みをブロックしますが、読み取りはブロックしません。 書き込みロックが取得されている場合、他のすべての Goroutine(読み取りと書き込みの両方)の進入をブロックします。同期ロックの役割は、リソースの使用時の排他性を保証し、並行性によるデータの破損を防ぎ、システムの安定性を保証することです。
3. チャネルの特徴と注意点は何ですか?#
- nil のチャネルにデータを送信すると、永久にブロックされます。
- nil のチャネルからデータを受信すると、永久にブロックされます。
- 閉じられたチャネルにデータを送信すると、パニックが発生します。
- 閉じられたチャネルからデータを受信する場合、バッファが空の場合はゼロ値が返されます。
4. GoConvey とは何ですか?一般的には何に使用されますか?#
- GoConvey は、Golang をサポートするユニットテストフレームワークです。
- goconvey は、ファイルの変更を自動的に監視し、テストを実行し、テスト結果をリアルタイムに Web インターフェースに出力することができます。
- goconvey は、テストケースの作成を簡素化するための豊富なアサーションを提供します。
5. Go 言語の make と new の違いは何ですか?#
- 両者はメモリの割り当てに使用されます。
- make は、スライス、マップ、およびチャネルの初期化にのみ使用され、返されるのはこれらの 3 つの参照型自体です。
- new は、型のメモリ割り当てに使用され、割り当てられたメモリの値は型のゼロ値です。返されるのは型へのポインタです。
6. Go 言語での配列とスライスの違いは何ですか?#
- 配列:
- 配列は固定の長さを持ちます。配列の長さは配列型の一部であり、したがって [3] int と [4] int は異なる 2 つの配列型です。配列のサイズは指定する必要がありますが、指定しない場合は初期化に基づいて自動的にサイズが推測されます。サイズは変更できません。配列は値渡しです。
- スライス:
- スライスの長さは変更できます。スライスは軽量なデータ構造であり、ポインタ、長さ、容量の 3 つのプロパティを持ちます。サイズを指定する必要はありません。スライスはアドレス渡し(参照渡し)です。配列から初期化することも、組み込み関数 make () を使用して初期化することもできます。初期化時の len=cap であり、その後拡張されます。
7. defer の役割と特徴は何ですか?#
- defer の役割は:
- 通常の関数またはメソッドの呼び出しの前に defer キーワードを追加するだけで、defer に必要な構文が完了します。defer ステートメントが実行されると、後に続く関数が遅延実行されます。含む defer ステートメントの関数が正常に終了するか、パニックによる異常終了であっても、関数が完了するまで後続の関数は実行されません。関数内には複数の defer ステートメントを含めることができ、実行順序は宣言順序と逆になります。
- defer の一般的な使用例:
- defer ステートメントは、対になる操作を処理するために使用されます。例えば、開く、閉じる、接続、切断、ロック、解放など。
- defer メカニズムにより、関数の複雑さに関係なく、リソースが解放されることが保証されます。
- リソースの解放に使用される defer は、リソースの要求の直後に配置する必要があります。
8. WaitGroup の使い方は?#
WaitGroup オブジェクトは、一連のゴルーチンの終了を待つことができます。使用方法は次のとおりです:
- main ゴルーチンは、wg.Add (delta int) を呼び出して worker ゴルーチンの数を設定し、worker ゴルーチンを作成します。
- worker ゴルーチンは終了した後、wg.Done () を呼び出す必要があります。
- main ゴルーチンは wg.Wait () を呼び出してブロックされ、すべての worker ゴルーチンが終了するまで待機します。
9. WaitGroup の実装原理は?#
- WaitGroup は、2 つのカウンター、要求カウンター v と待機カウンター w を管理します。これらは 64 ビットの値であり、要求カウンター v は上位 32 ビットを占め、待機カウンター w は下位 32 ビットを占めます。
- Add メソッドが実行されるたびに、要求カウンター v が 1 増加します。Done メソッドが実行されるたびに、待機カウンター w が 1 減少します。要求カウンター v が 0 になると、Wait () がシグナルを受け取ってブロックを解除します。
10. sync.Once とは何ですか?#
- sync.Once は、一度だけ実行されるアクションを実行するために使用されます。通常、シングルトンオブジェクトの初期化シナリオで使用されます。
- sync.Once は、Do メソッドしか公開されておらず、Do メソッドを複数回呼び出すことができますが、最初の Do メソッド呼び出し時にのみ f パラメータが実行されます。ここで、f は引数と戻り値のない関数です。
11. 原子操作とは何ですか?#
原子操作とは、途中で中断されることのない操作のことを指します。特定の値に対する原子操作は、その操作中に CPU がその値に対する他の操作を行わないことを保証します。このような厳密さを実現するために、原子操作は独立した CPU 命令によって代表され、実行されます。原子操作はロックフリーであり、他の同期技術の実装は通常、原子操作に依存しています。
12. 原子操作とロックの違いは何ですか?#
- 原子操作はハードウェアレベルでサポートされており、ロックはオペレーティングシステムのスケジューラによって実装されています。ロックは、一連のロジックを保護するために使用され、特定の変数の更新を保護するために使用されます。
- 原子操作は通常、効率的に実行され、コンピュータのマルチコアの利点を最大限に活用することができます。複合オブジェクトの更新が必要な場合は、atomic.Value で提供される実装を使用する必要があります。
13. マイクロサービスとは何ですか?#
マイクロサービス、またはマイクロサービスアーキテクチャは、ビジネスドメインをモデル化した小さな自治サービスの集合体としてアプリケーションを構築するアーキテクチャスタイルです。
簡単に言えば、蜂が六角形のワックスセルを整列させる方法を見る必要があります。彼らは最初にさまざまな材料で小さな部分から始め、大きなハチの巣を構築していきます。これらのセルはパターンを形成し、堅固な構造を作り、特定の部分をハチの巣に固定します。
ここで、各セルは他のセルと独立していますが、他のセルとも関連しています。したがって、1 つのセルの損傷は他のセルに影響を与えず、蜂はハチの巣を傷つけることなくこれらのセルを再構築することができます。