演算子の概要
演算子は、値に対する数学的または論理的な操作を指示する記号です。Go言語では、5つの主要な演算子カテゴリが定義されており、それぞれ異なる用途で使用されます。
| カテゴリ | 役割 |
|---|---|
| 算術演算子 | 数値の加減乗除および剰余計算 |
| 比較演算子 | 2つの値の大小・等価性を評価し、bool結果を返す |
| 論理演算子 | ブール値同士の結合(AND/OR)や反転(NOT) |
| ビット演算子 | 整数の各ビット単位での論理操作(AND/OR/XOR/シフト) |
| 複合代入演算子 | 演算と代入を1ステップで行うショートハンド表記 |
算術演算子
数値計算の基本となる演算子です。注意点として、++および--は文(statement)であり、式(expression)ではないため、他の算術演算子とは分類が異なります。
| 演算子 | 動作例 |
|---|---|
+ |
23 + 7 → 30 |
- |
42 - 18 → 24 |
* |
9 * 8 → 72 |
/ |
100 / 7 → 14(整数除算) |
% |
100 % 7 → 2(剰余) |
package main
import "fmt"
func main() {
var x int = 50
var y float64 = 3.14
x++
y--
fmt.Printf("x: %d, y: %.2f\n", x, y) // x: 51, y: 2.14
}
比較演算子
2つのオペランドを比較し、真偽値(trueまたはfalse)を返します。すべての比較演算子は左結合であり、型安全な比較が保証されます(型が異なる場合はコンパイルエラー)。
| 演算子 | 意味 |
|---|---|
> |
左辺が右辺より大きい |
< |
左辺が右辺より小さい |
== |
左辺と右辺が等しい |
>= |
左辺が右辺以上 |
<= |
左辺が右辺以下 |
!= |
左辺と右辺が等しくない |
package main
import "fmt"
func main() {
a, b := 15, 8
fmt.Println(a > b) // true
fmt.Println(a == b) // false
fmt.Println(a != 15) // false
}
論理演算子
ブール値の組み合わせや反転に使われ、条件分岐やループ制御で頻繁に利用されます。
| 演算子 | 動作 |
|---|---|
&& |
両方のオペランドがtrueの場合のみtrue |
|| |
いずれかのオペランドがtrueならtrue |
! |
オペランドの真偽を反転(true→false、false→true) |
package main
import "fmt"
func main() {
age := 25
hasLicense := true
canDrive := age >= 18 && hasLicense
isMinor := !(age >= 18)
fmt.Println("運転可能:", canDrive) // true
fmt.Println("未成年:", isMinor) // false
}
ビット演算子
符号なし整数に対してビット単位の操作を行います。性能重視の処理やフラグ管理、メモリ効率化などに有効です。
| 演算子 | 説明 |
|---|---|
& |
ビットごとのAND(両方が1なら1) |
| |
ビットごとのOR(どちらかが1なら1) |
^ |
ビットごとのXOR(異なれば1) |
<< |
左シフト(2n倍) |
>> |
右シフト(2n分の1) |
応用例:偶奇判定と単位定義
package main
import "fmt"
// 偶数判定(最下位ビットが0なら偶数)
func isEven(n uint) bool {
return n&1 == 0
}
// バイト単位の定数定義(シフトによる2の累乗表現)
const (
Byte = 1 << iota // 1
KibiByte // 1024 = 2^10
MebiByte // 1048576 = 2^20
GibiByte // 1073741824 = 2^30
)
func main() {
fmt.Printf("isEven(42): %t\n", isEven(42)) // true
fmt.Printf("isEven(17): %t\n", isEven(17)) // false
fmt.Printf("1 GiB = %d bytes\n", GibiByte)
}
複合代入演算子
演算と代入を同時に行う省略形で、コードの可読性と保守性を高めます。
| 演算子 | 等価な式 |
|---|---|
a += b |
a = a + b |
a &= b |
a = a & b |
a <<= n |
a = a << n |
package main
import "fmt"
func main() {
count := 10
count += 5 // count = count + 5 → 15
count &= 7 // count = count & 7 → 15 & 7 = 7
count <<= 2 // count = count << 2 → 7 << 2 = 28
fmt.Println(count) // 28
}