Analysis of Channel Usage in Go

Go 言語基礎 IV

今日は if 文、すなわち条件分岐文について学びます。まず if 文の定義を確認しましょう。

if の定義

条件付きステートメントでは、開発者が 1 つ以上の条件を指定し、その条件が真かどうかを判定することで、指定された文を実行するかどうかを決定します。条件が偽の場合は別の文を実行します。これを読んだ読者は、まだピンとこないかもしれません。真と偽はどのように表現するのでしょうか。

単層 if の構文フォーマット

• 条件式の括弧は省略できます。

• 初期化文を用いて、コードブロックのローカル変数を定義できます。

• コードブロックの左中括弧は条件式の末尾に配置する必要があります。

If ブール式 {

/* ブール式が true の場合に実行 */

}

ここで読者にお伝えしたいのは、if の後に指定された条件付きステートメントの条件を満たせば true とみなし、満たさなければ false を返すということです。

コードブロックに示すように、ここでは値が 3 の変数 a を定義し、その後に if による判定を行います。値が 2 より大きければ、関数を呼び出して true を出力します。そうでなければ false を返します。つまり、ここでは変数 a を判定しているわけです。関数の呼び出しで出力される内容は読者が自由に決定できます。

構文に関する注意

Go の構文では、三項演算子(a > b ? a : b)はサポートされていません。三項演算子に興味がある読者は、Java で三項演算子について学ぶことができます(本質的には if による判定の一形式です)。

以上は if 文による判定の簡単な練習です。読者が実際に試してみることができます。ブール式が true であれば、直後の文ブロックが実行されます。false であれば、else 文ブロックが実行されます。

Go 言語では、if 文はネスト処理もサポートしています。つまり、複数の if 文による判定を実現して、プログラムが期待する結果を得ることができます。

多層 if の構文フォーマット

上の図に示すように、if 文の中に別の if 文をネストしています。つまり、a==100 というデフォルト条件の下で変数 b の値に対する判定を記述し、最後に関数を呼び出して a と b の値を出力します。

複数の変数が同じ値に一致する場合は、switch 文を使用することがあります。

switch の定義

switch 文は、異なる条件に基づいて異なる処理を実行するために使用されます。各 case 分岐は一意で、上から下へ順に判定され、一致するまで試行されます。Go の switch 分岐式は任意の型を使用でき、定数に限定されません。break を省略でき、デフォルトで自動的に終了します。



上記のコードブロックから、grade と marks という 2 つのローカル変数を定義し、marks に対して switch を使用していることがわかります。case が異なる値に一致すると、関数を呼び出して出力される値が異なります。

type switch

switch 文は type switch にも使用でき、インターフェイス変数に実際に格納されている変数の型を判定できます。

Type Switch の用途は特に特殊ではないため、ここでは詳しく説明しません。読者は公式ウェブサイトで関連ドキュメントを参照して学習してください。

select の定義

• select 文は switch 文に似ていますが、実行可能な case をランダムに選択して実行します。実行可能な case がない場合は、実行可能な case が現れるまでブロックします。

• select は Go の制御構造で、通信に使用される switch 文に似ています。各 case は通信操作でなければならず、送信または受信のいずれかです。

• select は実行可能な case をランダムに選択して実行します。実行可能な case がない場合は、実行可能な case が現れるまでブロックします。default 句は常に実行可能であるべきです。

select 文の注意事項

• 各 case は通信でなければなりません。

• すべてのチャネル式が評価されます。

• すべての送信式が評価されます。

• 実行可能な通信があれば実行され、他は無視されます。

• 複数の case が実行可能な場合、select はランダムかつ公平に 1 つを選択して実行します。他は実行されません。

• default 句があれば、その文を実行します。

• default がなければ、select は通信が実行可能になるまでブロックします。Go はチャネルの値を再評価しません。

上記のコードに示すように、c1、c2、c3 の 3 つの変数を定義し、chan チャネルを使用しています。記述方法の説明:int 型のデータを送信できるチャネルは、一般的に channel int と記述します。上記の構文規則に従い、default 句があればその文が実行されます。したがって、上記コードブロックの出力は「no communication」となります。

select の使用補足

• select を使用してチャネルのデータフローを監視できます。

• select の使い方は switch 構文とよく似ています。select で新しい選択ブロックを開始し、各選択条件は case 文で記述します。

• switch 文は等価比較を使用して任意の条件を選択できます。select には多くの制限があり、最大の制限は各 case 文に IO 操作がなければならないことです。

• 読み取り可能な case がなければ、Go は自動的に default 文で記述された内容を読み取ります。通常、各 select プログラムには出力文があります。

• 満たされる case 文がなく、default 文も存在しない場合、プログラムはブロック状態に入り、ブロックが解除されるまでシステムから警告が発行されます。

タイムアウト判定

上記のコードブロックに基づき、select 文を定義しました。最初の case では、resChan を通じてデータを渡します。送信時間が 3 秒を超えると、2 番目の case 文が実行されます。

終了

// 別のゴルーチンで、操作中に不正な操作や処理できないエラーが発生した場合、shouldQuit にデータ通知を送信して操作を停止させる

close(shouldQuit)

構造体のチャネル用に shouldQuit 変数を定義します。まず、select ループを開き、case 内でチャネルメソッドを呼び出して対応する値を返します。該当する値がなければ、デフォルト値が返されます。同時に、別のゴルーチンで、不正な操作や処理できないエラーが発生した場合、shouldQuit にデータ通知を送信して実行を停止します。

チャネルの状態判定

リソース解放の妨げになる遅いキャッシュは好ましくありません。そこで、簡単な判定方法を使用できます。まず、長さ 5 の int 型チャネルを開きます。チャネル内で select ループを開き、ch がデータチャネルの値を受信できる場合は文を実行します。受信できない場合は、default 文でデータの破棄などの処理を行うことができます。

Related Articles

Explore More Special Offers

  1. Short Message Service(SMS) & Mail Service

    50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.