「Go/条件分岐と繰り返し」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
Continue文 Break文 Return文 のサンプル追加
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
12 行
C言語にある if や else や switch などの機能は、Goにもあります。しかし、たとえばスコープルール1つをとってもC言語にない要素をGoはもっています。
 
==== if文 ====
;C言語のif文:<syntaxhighlight lang=c>
if ( 条件式 ) 文
25 ⟶ 26行目:
: また、Goでは条件式は真理値である必要があり、<code>i != 0</code> を単に <code>i</code> とは書けません。
 
;[https://play.golang.org/p/iTj_he9lLIZ コード例]:<syntaxhighlight lang="go">
package main
 
import (
"fmt"
"math"
 
)
var x = 3
 
func main() {
if xnum :== 3math.NaN(); num < 0.0 {
fmt.Println("That's true")
} else if num > 0.0 {
fmt.Println("正")
} else if num == 0.0 {
fmt.Println("零")
} else {
fmt.Println("NaN")
}
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
NaN
That's true
</syntaxhighlight>
:if の条件式の前に「単純な文」を書くことができます(必須ではありません)。
:上の例では簡素な変数宣言で、変数 num を宣言して math.NaN() で初期化しています(スコープはif文が終わるまでです)。
:: math.NaN() は NaN(非数)を返す関数です。
:: NaN はfloat64型で、全ての浮動所数点数と比較したとき必ず false になる変わった値です。
:: NaN == NaN も false です。
:: このため浮動小数点数がNaNであるかは math.IsNaN() を使います。
: if文は条件がfalseだったとき実行する else 節を持つことができます(必須ではありません)。
: else 節は、さらに別の条件のif節を持つことができあます(必須ではありません)。
 
{{コラム|Goには条件演算子はありません|
論理式の中で「○○は△△と等しい」の意味で等号(イコール記号)を使う場合は、C言語と同様に、 <code>==</code> というふうに等号を2つ続けて使います。
Goには条件演算子(式 ? 値 : 値)はありません。
このため、条件演算子を書きたくなるケースでは、if文を使うことになります。
 
別解として、mapを使う方法があります。
条件「〜でなければ」の else を使う場合、下記のように
;[https://play.golang.org/p/LE4oWslBmSc コード例]:<syntaxhighlight lang="go">
package main
 
import (
:<syntaxhighlight lang="go">
"fmt"
} else {
"unsafe"
fmt.Println("偽です")
)
}
</syntaxhighlight >
 
func main() {
;コード例:<syntaxhighlight lang="go">
n := 0x5a5a5a5a5a5a5a5a
package main
size := int(unsafe.Sizeof(n)) * 8
 
for i := 0; i < size; i++ {
import "fmt"
if (1 << (size - i - 1) & n) == 0 {
fmt.Print("●")
} else {
fmt.Print("○")
}
}
fmt.Println()
 
m := map[bool]string{false: "●", true: "○"}
var x = 7
for i := 0; i < size; i++ {
fmt.Print(m[(1<<(size-i-1)&n) != 0])
}
fmt.Println()
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●
●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●●○●○○●○●
</syntaxhighlight>
}}
 
==== switch文 ====
switch文をつかうと複雑になったif文を簡素に書き換えることができます。
;[https://play.golang.org/p/bXQaelJwaO9 コード例]:<syntaxhighlight lang="go" line>
package main
 
import (
"fmt"
"math"
)
 
func main() {
ifswitch xnum =:= 3math.NaN(); {
case num < 0.0:
fmt.Println("真だ")
fmt.Println("負")
} else {
case num > 0.0:
fmt.Println("偽です")
fmt.Println("正")
case num == 0.0:
fmt.Println("零")
default :
fmt.Println("NaN")
}
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
NaN
偽です
</syntaxhighlight>
:if文のコーデ例をswitch文に置き換えてみました。
;switch文の冒頭:<syntaxhighlight lang="go" start=9 line>
switch num := math.NaN(); {
</syntaxhighlight>
:は
:<syntaxhighlight lang="go" start=9 line>
switch num := math.NaN(); true {
</syntaxhighlight>
:の省略形で、if文と同じく「単純な文」を書くことができます(必須ではありません)。
:上の例では簡素な変数宣言で、変数 num を宣言して math.NaN() で初期化しています(スコープはif文が終わるまでです)。
:Cファミリーの言語を知っている人ならば、'''break''' がないのが気になると思いますが、Goのswitch文のcase節ではbreakが標準動作で、フォールスルーさせるためには、'''fallthrough''' 文を使います<ref>Javaの -> と同じふるまいをします。ただしGoのswitch文はJavaの様に文の値を持ちません。</ref>。
:Goのcase文の式には、定数以外も書くこともでき上の例では(動的な)比較演算が使われています。
:この例では(暗黙の)true と比較しているの、最初にtrueになったcaseに対応する文が実行されるのですが、numはNaNでどの条件にも当てはまらないので default 節まで落ちてきます。
 
==== selecth文 ====
selecth文はswitch文と似ていますが、通信チャンネルの並行待ちを行います。
 
=== イテレート - for文 ===