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 つのチャネルを選択して実行します。すべてのチャネルが準備できていない場合、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 には三項演算子はなく、
? :
形式の条件判断はサポートされていません。