==
や<
などの比較演算もブール値を生成します。
単項演算子!
論理 NOT 演算に対応するため、 !true
の値は false となり、より複雑な書き方は(!true==false) ==true
になります。実際の開発では、比較的簡潔な記述を心がける必要があります。 Let x がx==true
であることを意味するなどのブール式。
var aVar = 10
aVar == 5 // false
aVar == 10 // true
aVar != 5 // true
aVar != 10 // false
Go 言語では値間の比較に非常に厳しい制限があり、比較できるのは同じ型の 2 つの値のみです。値の型がインターフェイスの場合は、同じインターフェイスも実装する必要があります。いずれかの値が定数の場合、もう一方の値は定数でなくてもかまいませんが、型は定数の型と同じである必要があります。上記の条件がいずれも満たされない場合は、比較を行う前に、値の 1 つを他の値と同じ型に変換する必要があります。
ブール値は && (AND) および || (OR) 演算子と組み合わせることができ、短絡動作が行われます。演算子の左側の値がすでにブール式全体の値を決定できる場合、その値は演算子の右側の値は評価されなくなるため、次の式は常に安全です。
s != "" && s[0] == 'x'
このうち、s[0]演算を空文字列に適用するとパニック例外が発生します。
&&
||
より優先順位が高いため (&& は論理乗算に対応し、|| は論理加算に対応し、乗算は加算よりも優先されます)、次のブール式は省略できます。
if'a' <= c && c <= 'z' ||
'A' <= c && c <= 'Z' ||
'0' <= c && c <= '9' {
// ...ASCIIのアルファベットや数字...
}
ブール値は数値 0 または 1 に暗黙的に変換されず、その逆も同様で、if ステートメントを使用して明示的に変換する必要があります。
i := 0
if b {
i = 1
}
同様の変換を頻繁に行う必要がある場合は、以下に示すように、変換コードを関数にカプセル化できます。
// もしbがTrueなら、btoiは1を返す。Falseなら、0を返す
func btoi(b bool) int {
if b {
return 1
}
return 0
}
数値からブール値への逆変換は非常に簡単ですが、対称性を維持するために関数をラップすることもできます。
// itob関数は、iが0でない場合にtrueを返します。
func itob(i int) bool { return i != 0 }
Go 言語では整数をブール値にキャストすることはできません。コードは次のとおりです。
var n bool
fmt.Println(int(n) * 2)
コンパイルエラーが発生した場合、出力は次のようになります。
cannot convert n (type bool) to type int
ブール型は数値演算に参加できず、他の型に変換することもできません。