Go言語の演算子、特に比較について学んでいきましょう!
プログラムを書いていると、「もしこの値が10だったら」「もし名前がゲストじゃなかったら」みたいに、条件によって動きを変えたい場面がたくさん出てきますよね。
そんなときに大活躍するのが「比較演算子」なんです。
なんだか難しそう? いえいえ、大丈夫! このページを読めば、Go言語の比較演算子の基本から、ちょっとしたコツ、気をつけたいポイントまで、まるっと理解できちゃいます。
この記事で学べることリスト
- 比較演算子がプログラムでどんな役割を果たすのか
- Go言語で使える比較演算子の種類とその意味
- 比較演算子の基本的な書き方ルール
- 実際のプログラム(if文)での比較演算子の使い方
- 初心者がつまずきやすい比較演算子の注意点
Go言語の比較演算子とは?プログラム制御の基礎
まず、「比較演算子って、そもそも何?」というところから始めましょう。
比較演算子は、2つの値(数字や文字など)を比べて、その結果が「合っているか(true)」、「間違っているか(false)」を教えてくれる記号のことです。
例えば、「変数xの値は10ですか?」とか「変数yの値は0より大きいですか?」といった疑問に、コンピューターが「はい(true)」か「いいえ(false)」で答えてくれるイメージですね。
これがどうしてプログラムで必要なのでしょうか?
それは、プログラムの流れをコントロールするためです。
例えば、おなじみの `if` 文。「もし○○だったら××する」という処理は、まさに比較演算子の結果(trueかfalseか)を見て、次に何をするか決めているんですよ。
他にも、繰り返し処理 `for` 文で「カウンタが10未満の間は繰り返す」といった条件にも使われます。
比較演算子は、プログラムに「判断力」を与えて、賢く動かすための基本部品なんです。
Go言語の比較演算子一覧と基本的な書き方
Go言語でよく使う比較演算子は、主に以下の6種類があります。一度は見たことがある記号かもしれませんね。
==
: 等しい (同じだったら true)!=
: 等しくない (違ったら true)<
: より小さい (左側が右側より小さかったら true)<=
: 以下 (左側が右側と同じか、小さかったら true)>
: より大きい (左側が右側より大きかったら true)>=
: 以上 (左側が右側と同じか、大きかったら true)
基本的な使い方は、比べたい2つの値の間に、これらの記号を書くだけです。
書き方のルールはこんな感じ。
値1 比較演算子 値2
例えば、変数 `a` と変数 `b` が同じかどうか知りたければ a == b
と書きます。
変数 `score` が 60点以上かどうか知りたければ score >= 60
と書きます。
こう書くと、コンピューターが計算してくれて、結果として `true` か `false` のどちらかを返してくれます。この結果を `if` 文などで使っていくわけですね。
等価演算子(==, !=)
まずは「同じかどうか」を調べる演算子、==
(等価)と !=
(不等価)を見てみましょう。
==
は、左右の値がピッタリ同じ場合に `true` になります。
!=
は、左右の値が違う場合に `true` になります。プログラミングでは「ノットイコール」なんて呼ばれたりもしますね。
簡単な例を見てみましょう。
package main import "fmt" func main() { num1 := 10 num2 := 5 name1 := "Gopher" name2 := "Gopher" fmt.Println(num1 == num2) // 10 と 5 は等しい? fmt.Println(num1 != num2) // 10 と 5 は等しくない? fmt.Println(name1 == name2) // "Gopher" と "Gopher" は等しい? fmt.Println(name1 != "Go") // "Gopher" と "Go" は等しくない? }
これを実行すると、こんな結果が表示されます。
false true true true
数字だけでなく、文字列も比べられるのがわかりますね。
ここで絶対に間違えてはいけないのが、=
1つと ==
2つの違いです。
=
1つは「代入」といって、変数に値を入れるときに使います(例: num1 = 10
)。
==
2つは「比較」です。値を比べる時に使います(例: num1 == 10
)。
これを間違えると、エラーになったり、意図しない動きになったりするので、しっかり区別してくださいね!
関係演算子(<, <=, >, >=)
次に、値の大きさの関係を比べる演算子、<
, <=
, >
, >=
です。
これは数学の不等号と同じような意味合いですね。
<
: 左が右より小さい (未満)<=
: 左が右と同じか小さい (以下)>
: 左が右より大きい (超える)>=
: 左が右と同じか大きい (以上)
主に数字の大小を比べるときに使います。
package main import "fmt" func main() { age := 25 score := 80 fmt.Println(age < 20) // 25 は 20 より小さい? fmt.Println(age >= 18) // 25 は 18 以上? fmt.Println(score > 90) // 80 は 90 より大きい? fmt.Println(score <= 80) // 80 は 80 以下? }
実行結果はこうなります。
false true false true
どうでしょう? 直感的にわかりやすいのではないでしょうか。
これらの演算子も結果は true
か false
のどちらかになります。この結果を使って、プログラムは「年齢が18歳以上なら成人向けの処理をする」といった判断を行うわけです。
Go言語の比較演算子の使い方(サンプルコードで学ぶ)
さて、個々の比較演算子の意味がわかったところで、実際にプログラムの中でどうやって使っていくのかを見ていきましょう。
比較演算子が一番活躍するのは、やはり `if` 文の中です。
「もし(if)○○という条件が成り立ったら(trueだったら)、××を実行する」という、プログラムの基本的な流れを作るのに欠かせません。
`if`文での比較演算子の活用例
百聞は一見にしかず、ということで具体的なコードを見てみましょう。
例えば、ある点数 `score` によって、評価メッセージを変えるプログラムを書いてみます。
package main import "fmt" func main() { score := 75 fmt.Printf("点数: %d点\n", score) if score == 100 { fmt.Println("満点です!素晴らしい!") } else if score >= 80 { fmt.Println("高得点!よくできました!") } else if score >= 60 { fmt.Println("合格です。もう少し頑張りましょう!") } else if score < 0 { fmt.Println("点数がマイナス…? 何か入力がおかしいようです。") } else { fmt.Println("残念ながら不合格です。次回頑張りましょう。") } // != の例: 0点ではなかったら何か言う if score != 0 { fmt.Println("0点ではありませんでしたね。") } }
これを実行すると、`score` が 75 なので、以下の結果が表示されます。
点数: 75点 合格です。もう少し頑張りましょう! 0点ではありませんでしたね。
このコードでは、上から順番に `if` や `else if` の条件式が評価されます。
まず `score == 100` (75は100か?) → false
次に `score >= 80` (75は80以上か?) → false
次に `score >= 60` (75は60以上か?) → true! ここが実行されます。
一度 true になって処理が実行されると、それ以降の `else if` や `else` は無視されます(最後の `if score != 0` は独立した `if` 文なので評価されます)。
このように、比較演算子の結果(true/false)が、プログラムのどの部分を実行するかを決定しているのです。
データ型が異なるときの比較について
Go言語は、プログラムの安全性を高めるために「型」に厳しい言語です。
どういうことかというと、基本的に比較演算子は、同じ種類のデータ(同じ型)同士でないと使えない、というルールがあります。
例えば、数字の `10` (int型) と、文字の `"10"` (string型) は、人間から見ると似ていますが、Go言語にとっては全くの別物です。
試しに、違う型の値を比較しようとするとどうなるでしょう?
package main import "fmt" func main() { num := 10 str := "10" // fmt.Println(num == str) // ← これを実行しようとするとエラーになる! }
上のコードのコメントアウト(//
)を外して実行しようとすると、コンパイル時に「invalid operation: num == str (mismatched types int and string)
」のようなエラーメッセージが表示されます。「型が違うから比較できませんよ!」と怒られちゃうわけですね。
数字は数字同士、文字列は文字列同士で比較するのが基本、と覚えておきましょう。
Go言語 比較演算子を使う上での注意点
比較演算子はとても便利ですが、いくつか気をつけたいポイント、いわゆる「落とし穴」もあります。
ここで紹介する点を頭に入れておけば、余計なバグに悩まされる時間を減らせるはずです!
`==` と `=` の混同に注意
これは本当によくある間違いなので、もう一度だけ言わせてください!
比較の「==
」(イコール2つ)と、代入の「=
」(イコール1つ)は全くの別物です。
`if` 文の条件を書くつもりが、うっかり =
1つで書いてしまうと…
package main import "fmt" func main() { score := 50 target := 100 // 間違い例: if score = target { ... } // これは代入なのでエラーになることが多い // 正しい例: if score == target { ... } if score = target; score == target { // Goではこういう書き方もできるけど、今は気にしないでOK fmt.Println("代入と比較を同時に行う特殊な書き方もあります") } if score == target { fmt.Println("スコアがターゲットと同じです!") // scoreは上で100に代入されてしまっているので、表示される } else { fmt.Println("スコアがターゲットと違います。") } // ちなみに、Go言語ではif文の条件式の結果は必ずbool型(true/false)でないといけないので、 // C言語などと違って if (score = 100) { ... } のような書き方は通常エラーになります。 // (ただし、if文の簡易ステートメント部分での代入は可能です) // とはいえ、やはり == と = はしっかり区別するのが一番です! }
Go言語は他の言語よりは `if (x = y)` のような間違いをエラー検知しやすい仕組みにはなっていますが、それでも混乱のもとです。
「比べる時はイコール2つ!」としっかり覚えてくださいね。
比較できない型もある
先ほど「違う型同士は比較できない」と言いましたが、実は同じ型の中でも、比較演算子が使えない、あるいは使い方に制限がある型も存在します。
例えば、複数の値をまとめて扱う「スライス」や「マップ」、処理をまとめた「関数」などは、基本的に <
や >
といった大小比較はできません。
==
や !=
での比較も、型によってできる場合とできない場合があります。
例えば、複数の要素を順番に並べた「配列」や、いくつかの変数をまとめた「構造体」などは、その中身の型が全て比較可能であれば、==
や !=
で比較できます。
現段階では、「すべてのデータが自由に比較できるわけではないんだな」くらいに覚えておけば十分です。プログラムを書いていくうちに、もし比較できない型で比較しようとしたら、コンパイラがエラーで教えてくれますから、その時にまた詳しく調べてみましょう。
浮動小数点数の比較の落とし穴
最後に、ちょっとだけ応用的な注意点です。小数点数(Go言語では `float32` や `float64`)を扱う場合です。
コンピューターは、小数点数を扱うのが実は少し苦手で、計算の途中でほんのわずかな「誤差」が生じることがあります。
例えば、計算上は `0.3` になるはずが、コンピューター内部では `0.29999999999999998` のように、ごくわずかにズレてしまうことがあるのです。
そのため、浮動小数点数同士を ==
でピッタリ一致するかどうか比較すると、予期せず `false` になってしまうことがあります。
package main import "fmt" func main() { a := 0.1 b := 0.2 sum := a + b // 本来は 0.3 になってほしい fmt.Println(sum == 0.3) // 結果は false になる可能性がある! fmt.Println(sum) // 実際に表示してみると 0.30000000000000004 などになるかも }
これを避けるためには、直接 ==
で比べる代わりに、「2つの値の差が、ごくわずかな値(イプシロンと言ったりします)よりも小さいかどうか」で判断するのが一般的です。
ただ、初心者の方はまず「小数点数の ==
比較は、思った通りにならないことがある」とだけ覚えておけばOKです!
【まとめ】Go言語の比較演算子を理解して活用しよう
Go言語の比較演算子について、基本的なところから注意点まで見てきました。
ポイントを振り返ってみましょう。
- 比較演算子は値を比べて `true` か `false` を返す記号
==
,!=
,<
,<=
,>
,>=
の6種類が基本- 主に `if` 文の中で条件判断に使う
- 比較は基本的に同じ型のデータ同士で行う
==` (比較) と `=
(代入) を間違えない!- 小数点数の比較は誤差に注意
比較演算子は、プログラムに条件分岐という「考える力」を与えるための、とても基本的な部品です。
今回の内容をしっかり理解して、ぜひ実際のコードの中で活用してみてください。
最初は少し戸惑うかもしれませんが、使っていくうちに自然と身についていきますよ。
自信を持って、どんどんGo言語のコードを書いていきましょう!
【関連記事】 Go言語とは?特徴・できること・将来性
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。