banner
Pi3

Pi3

记录学习、生活和成长
github
telegram
x
zhihu
email

Go言語入門6:条件文

Go 言語入門基礎学習ノートの Go 言語の条件文

golang

条件文#

if 文#

if ブール式 {
   /* ブール式が true のとき実行 */
}

if else 文#

if ブール式 {
   /* ブール式が true のとき実行 */
} else {
  /* ブール式が false のとき実行 */
}

if ネスト文#

if ブール式 1 {
   /* ブール式 1 が true のとき実行 */
   if ブール式 2 {
      /* ブール式 2 が true のとき実行 */
   }
}

switch 文#

注意が必要なのは、switch 文の実行プロセスは上から下へ進み、マッチする項目が見つかるまで続き、マッチした後はbreak を追加する必要はありません

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

switch はデフォルトで case の最後に break 文が付いており、マッチが成功すると他の case は実行されません。もし後の case を実行したい場合は、fallthrough を使用できます。

fallthrough を使用すると、後の case 文が強制的に実行され、fallthrough は次の case の式の結果が true かどうかを判断しません。

package main

import "fmt"

func main() {

    switch {
    case false:
            fmt.Println("1、case条件文はfalseです")
            fallthrough
    case true:
            fmt.Println("2、case条件文はtrueです")
            fallthrough
    case false:
            fmt.Println("3、case条件文はfalseです")
            fallthrough
    case true:
            fmt.Println("4、case条件文はtrueです")
    case false:
            fmt.Println("5、case条件文はfalseです")
            fallthrough
    default:
            fmt.Println("6、デフォルトcase")
    }
}

// 出力結果
2、case条件文はtrueです
3、case条件文はfalseです
4、case条件文はtrueです

switch 文はType-Switchにも使用でき、特定のinterface 変数に実際に格納されている変数の型を判断します。

switch x.(type){
    case type:
       statement(s);      
    case type:
       statement(s); 
    /* 任意の数のcaseを定義できます */
    default: /* オプション */
       statement(s);
}

例えば:

package main

import "fmt"

func main() {
   var x interface{}
     
   switch i := x.(type) {
      case nil:   
         fmt.Printf(" x の型 :%T",i)                
      case int:   
         fmt.Printf("x は int 型です")                       
      case float64:
         fmt.Printf("x は float64 型です")           
      case func(int) float64:
         fmt.Printf("x は func(int) 型です")                      
      case bool, string:
         fmt.Printf("x は bool または string 型です" )       
      default:
         fmt.Printf("未知の型です")     
   }   
}

// 出力結果
x の型 :<nil>

%T は変数のデータ型を出力するために使用されます

select 文#

select は Go における制御構造で、switch 文に似ています。

並行処理の章の Select 文を参照してください。

select 文はチャネル操作にのみ使用でき、各 case はチャネル操作でなければなりません。送信または受信のいずれかです。

select 文は指定されたすべてのチャネルの操作を監視し、いずれかのチャネルが準備できると、対応するコードブロックが実行されます。

複数のチャネルが準備できている場合、select 文はランダムに 1 つのチャネルを選択して実行します。すべてのチャネルが準備できていない場合、デフォルトブロック内のコードが実行されます。

select {
  case <- channel1:
    // 実行されるコード
  case value := <- channel2:
    // 実行されるコード
  case channel3 <- value:
    // 実行されるコード

    // 任意の数のcaseを定義できます

  default:
    // すべてのチャネルが準備できていない場合、実行されるコード
}

以下は select 文の構文を説明します:

  • 各 case はチャネルでなければなりません
  • すべてのチャネル式が評価されます
  • すべての送信される式が評価されます
  • いずれかのチャネルが実行可能であれば、それが実行され、他は無視されます。
  • 複数の case が実行可能な場合、select はランダムに公平に 1 つを選択して実行し、他は実行されません。そうでない場合:
    • default 句があれば、その文が実行されます。
    • default 句がない場合、select はブロックされ、いずれかのチャネルが実行可能になるまで待機します;Go はチャネルや値を再評価しません。
package main

import (
    "fmt"
    "time"
)

func main() {

    c1 := make(chan string)
    c2 := make(chan string)

    go func() {
        time.Sleep(1 * time.Second)
        c1 <- "one"
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "two"
    }()

    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-c1:
            fmt.Println("受信:", msg1)
        case msg2 := <-c2:
            fmt.Println("受信:", msg2)
        }
    }
}

// 出力結果
受信: one
受信: two

上記の例では、2 つのチャネル c1 と c2 を作成しました。

select 文は 2 つのチャネルのデータを待機します。c1 からデータを受信すると、受信: oneと表示され、c2 からデータを受信すると、受信: twoと表示されます。

次の例では、2 つのチャネルを定義し、2 つのゴルーチンを起動してこれらのチャネルからデータを取得します。main 関数内で、select 文を使用してこれらのチャネルからノンブロッキングで選択し、両方のチャネルに利用可能なデータがない場合は、default 句内の文を実行します。

次の例を実行すると、2 つのチャネルからデータを継続的に取得し、両方のチャネルに利用可能なデータがない場合は、メッセージは受信されませんと表示されます。

package main

import "fmt"

func main() {
  // 2つのチャネルを定義
  ch1 := make(chan string)
  ch2 := make(chan string)

  // 2つのゴルーチンを起動し、それぞれのチャネルからデータを取得
  go func() {
    for {
      ch1 <- "from 1"
    }
  }()
  go func() {
    for {
      ch2 <- "from 2"
    }
  }()

  // select文を使用してノンブロッキングで2つのチャネルからデータを取得
  for {
    select {
    case msg1 := <-ch1:
      fmt.Println(msg1)
    case msg2 := <-ch2:
      fmt.Println(msg2)
    default:
      // 両方のチャネルに利用可能なデータがない場合、ここでの文を実行
      fmt.Println("メッセージは受信されません")
    }
  }
}

Go には三項演算子はなく、? :形式の条件判断はサポートされていません。

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