xfeng

xfeng

Sporting | Reading | Technology | Recording
github
bilibili

初めてGolangを知る

image

1. goroutine とは何ですか?それを停止する方法はありますか?#

  • goroutine は、関数またはメソッドの実行と同時に他の goroutine スレッドが実行される特殊な goroutine スレッドです。 goroutine スレッドは標準スレッドよりも軽量であり、ほとんどの Golang プログラムは数千の goroutine を同時に使用します。
  • goroutine を作成するには、関数宣言の前に go キーワードを追加します。
  • goroutine を停止するには、信号チャネルに信号を送信します。 goroutine は、チェックが指示されたときにのみ信号に応答するため、ロジックの場所(たとえば、for ループの先頭など)にチェックを含める必要があります。

2. 同期ロックの特徴は何ですか?役割は何ですか?#

  • Go 言語では、共有メモリを介した通信ではなく、通信を介した共有メモリを実現することが推奨されています。Go の CSP(Communicating Sequential Process)並行モデルは、goroutine とチャネルを使用して実現されます。
  • Goroutine が Mutex を取得すると、他の Goroutine は待機する必要があります。 Mutex を解放するまで、他の Goroutine は書き込みをブロックしますが、読み取りはブロックしません。 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 は異なる配列型です。配列のサイズは指定する必要がありますが、指定しない場合は初期化に基づいて自動的にサイズが推定されます。サイズは変更できません。配列は値渡しです。
  • スライス:
    • スライスは可変の長さを持ちます。スライスは軽量なデータ構造であり、ポインタ、長さ、容量の 3 つの属性を持ちます。サイズを指定する必要はありません。スライスはアドレス渡し(参照渡し)です。配列から初期化することも、組み込み関数 make () を使用して初期化することもできます。初期化時の len = cap であり、その後拡張されます。

7. defer の役割と特徴は何ですか?#

  • defer の役割は:
    • 通常の関数またはメソッドの呼び出しの前に defer キーワードを追加するだけで、defer に必要な構文が完了します。defer ステートメントが実行されると、後に続く関数が遅延実行されます。包含する defer ステートメントを含む関数が実行を完了するまで、defer 後の関数は実行されません。関数が return によって正常に終了するか、パニックによって異常終了するかに関係なく、複数の 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 つのセルの損傷が他のセルに影響を与えないため、蜜蜂は蜂箱を影響せずにこれらのセルを再構築することができます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。