Go 言語入門基礎学習ノートの Go 言語の条件文
条件文#
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 には三項演算子はなく、
? :
形式の条件判断はサポートされていません。