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 後の関数は実行されません。関数が return によって正常に終了するか、パニックによって異常終了するかに関係なく、defer 後の関数は実行されます。1 つの関数に複数の defer ステートメントを記述することができ、実行順序は宣言順序と逆です。
- defer の一般的な使用例:
- defer ステートメントは、対になる操作を処理するために使用されます。例えば、オープン、クローズ、接続、切断、ロック、ロック解除など。
- defer メカニズムにより、関数の複雑さに関係なく、リソースが解放されることが保証されます。
- リソースの解放に使用される defer は、リソースの要求の直後に配置する必要があります。
8. WaitGroup の使い方は?#
WaitGroup オブジェクトは、一連の goroutine の終了を待つことができます。使用方法は次のとおりです:
- main の goroutine は、wg.Add (delta int) を呼び出して worker の goroutine の数を設定し、worker の goroutine を作成します。
- worker の goroutine は終了した後、wg.Done () を呼び出します。
- main の goroutine は wg.Wait () を呼び出してブロックされ、すべての worker の goroutine が終了するまで待機します。
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 つのセルの損傷は他のセルに影響を与えず、蜜蜂は巣を損なうことなくこれらのセルを再構築することができます。