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")
    }
}

// 出力結果
2case 条件文は true
3case 条件文は false
4case 条件文は 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 つのチャネルを選択して実行します。すべてのチャネルが準備できていない場合、default ブロック内のコードが実行されます。

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 文を使用してこれら 2 つのチャネルから非ブロッキングで選択し、両方のチャネルに利用可能なデータがない場合は default 句内の文を実行します。

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

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:
      // 2つのチャネルに利用可能なデータがない場合、ここにある文を実行
      fmt.Println("no message received")
    }
  }
}

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

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