Golang における演算子を用いたデータ処理

GolangBeginner
オンラインで実践に進む

はじめに

プログラミング言語において変数を定義してデータを保存した後、そのデータをどのように処理すればよいでしょうか。

そこで必要になるのが、保存されたデータに対して計算を行うための演算子(Operators)です。このセクションでは、以下の内容について学習します。

学習ポイント:

  • 算術演算子
  • 比較演算子(関係演算子)
  • 論理演算子
  • 代入演算子

基本的な形式

算術演算子は最も基本的な演算子であり、基礎的な計算方法を表します。

演算子 機能
+ 加算(足し算)
- 減算(引き算)
* 乗算(掛け算)
/ 除算(割り算)
% 剰余(余り)

home/project/ ディレクトリに opePractice.go という名前のファイルを作成します。

cd ~/project
touch opePractice.go

ファイルに以下のコードを記述してください。

package main

import "fmt"

func main() {
    a := 10
    b := 3
    fmt.Println("a =", a, "b =", b)
    fmt.Println("-----")

    // 加算、減算、乗算
    fmt.Println("a + b =", a+b)
    fmt.Println("a - b =", a-b)
    fmt.Println("b - a =", b-a)
    fmt.Println("a * b =", a*b)

    // 除算
    // Go では、整数同士の割り算の場合、結果は切り捨てられます。
    fmt.Println("a / b =", a/b)
    // しかし、浮動小数点数(float)で割り算を行えば、この問題は発生しません。
    fmt.Println("10.0 / 3 =", 10.0/3)

    // 剰余計算:一般的な形式
    fmt.Println("a % b =", a%b)
    // 負の数を含む剰余計算
    // 計算式:剰余 = 被除数 - (被除数 / 除数) * 除数
    fmt.Println("10 % -3 =", 10%-3)
    fmt.Println("-10 % 3 =", -10%3)
    fmt.Println("-10 % -3 =", -10%-3)
}

コードを実行し、特に負の数の余りがどのように計算されるかに注目してください。

cd ~/project
go run opePractice.go
a = 10 b = 3
-----
a + b = 13
a - b = 7
b - a = -7
a * b = 30
a / b = 3
10.0 / 3 = 3.3333333333333335
a % b = 1
10 % -3 = 1
-10 % 3 = -1
-10 % -3 = -1

インクリメントとデクリメント

Go において、++(インクリメント)と --(デクリメント)は独立した「文(Statement)」であり、単独で使用する必要があります。これらは他の言語とは異なり、式の一部として扱うことはできません。

以下のコードは誤りです。

var a int = 5
var i int = 0
a = i++ // 誤った使い方:インクリメントは単独で記述する必要があります
a = i-- // 誤った使い方:デクリメントは単独で記述する必要があります
a = ++i // 誤った使い方:Go には前置インクリメントは存在しません
a = --i // 誤った使い方:Go には前置デクリメントは存在しません

正しい構文は以下の通りです。

var i = 0
i++
i++
fmt.Println(i)

opePractice.go に以下のコードを記述してください。

インクリメント演算子を使って変数 i の値を変更し、変数 a の値が 16 になるようにコードを完成させてください。

package main

import "fmt"

func main() {
    var a int = 15
    var i int = 0
    /* 以下にコードを記述 */

    a = a + i
    fmt.Println(a)
    // a の出力結果が 16 になるようにコードを完成させてください
}

比較演算子

比較演算子(関係演算子)とは何でしょうか。

比較演算子は、2 つの値の関係を記述するためのものです。2 つの値が等しいか、あるいは一方が他方より大きいか小さいかを判定します。

演算子 関係
== 等しい
!= 等しくない
> より大きい
>= 以上(より大きいか等しい)
< より小さい
<= 以下(より小さいか等しい)

上記の演算子は、条件を満たせば true を、そうでなければ false を返します。

opePractice.go に以下のコードを記述してください。

package main

import "fmt"

func main() {
    // 比較演算子の使用
    var a int = 7
    var b int = 6
    // 等しいかチェック
    fmt.Println(a == b)  // false
    // 等しくないかチェック
    fmt.Println(a != b)  // true
    // a が b より大きいかチェック
    fmt.Println(a > b)   // true
    // a が b 以上かチェック
    fmt.Println(a >= b)  // true
    // a が b より小さいかチェック
    fmt.Println(a < b)   // false
    // a が b 以下かチェック
    fmt.Println(a <= b)  // false
    // 1 が 1 と等しいかチェック
    judgeValue := 1 == 1 // true
    fmt.Println(judgeValue)
}

コードを実行します。

cd ~/project
go run opePractice.go

上記のコードでは、変数 ab に基づいて比較を行いました。

変数の値を書き換えて比較結果がどのように変わるか試し、比較演算子への理解を深めてください。

論理演算子

論理演算子とは何でしょうか。

論理演算子は、比較演算子をさらに発展させたものです。主に複数の比較条件を組み合わせて、より複雑な評価を行うために使用されます。

演算子 関係 説明
&& 論理積 (And) 両方の値が true の場合、結果は true になります
|| 論理和 (Or) いずれかの値が true の場合、結果は true になります
! 論理否定 (Not) 条件が false であれば、結果は true になります

opePractice.go に以下のコードを記述してください。

package main

import (
    "fmt"
)

func main() {
    // 論理積演算子 && のデモンストレーション
    var age int = 18
    if age > 15 && age < 30 {
        fmt.Println("年齢は 15 歳から 30 歳の間です")
    }
    if age > 30 && age < 80 {
        fmt.Println("年齢は 30 歳から 80 歳の間です")
    }
    // 論理和演算子 || のデモンストレーション
    if age > 15 || age < 30 {
        fmt.Println("年齢は 15 歳より大きい、または 30 歳より小さいです")
    }
    if age > 30 || age < 40 {
        fmt.Println("年齢は 30 歳より大きい、または 40 歳より小さいです")
    }
    // 論理否定演算子 ! のデモンストレーション
    if age > 30 {
        fmt.Println("年齢は 30 歳より大きいです")
    }
    if !(age > 30) {
        fmt.Println("年齢は 30 歳より大きくありません")
    }
}

このコードでは、変数 age の値(18)に基づいて一連の論理評価を行っています。

コードを実行します。

cd ~/project
go run opePractice.go

age 変数の値を変更して実行し、出力結果がどのように変化するか観察してください。

論理演算子の実行順序

論理積(AND)や論理和(OR)演算子を使用する場合、Go は演算子の両側の真偽値を判定する必要があります。では、どちら側が先に評価されるのでしょうか。

一緒に探ってみましょう。

opePractice.go に以下のコードを記述してください。

package main

import "fmt"

func leftFunc(flag bool) bool {
    fmt.Println("左側の関数が呼び出されました!")
    return flag
}

func rightFunc(flag bool) bool {
    fmt.Println("右側の関数が呼び出されました!")
    return true
}

func main() {
    if leftFunc(true) && rightFunc(true) {
        fmt.Println("評価が完了しました")
    }
}

コードを実行します。

cd ~/project
go run opePractice.go
左側の関数が呼び出されました!
右側の関数が呼び出されました!
評価が完了しました

論理積(AND)演算では、まず左側の値が評価され、その後に右側の値が評価されることがわかります。

では、論理和(OR)演算はどうでしょうか。opePractice.go を以下のように書き換えてください。

package main

import "fmt"

func leftFunc(flag bool) bool {
    fmt.Println("左側の関数が呼び出されました!")
    return flag
}

func rightFunc(flag bool) bool {
    fmt.Println("右側の関数が呼び出されました!")
    return true
}

func main() {
    if leftFunc(true) || rightFunc(true) {
        fmt.Println("論理和の評価が完了しました")
    }
}

コードを実行します。

cd ~/project
go run opePractice.go
左側の関数が呼び出されました!
論理和の評価が完了しました

論理積と論理和のどちらも、評価の順序は左から右です。

しかし、論理和(OR)演算では、左側の値が true である場合、右側の値は評価されません(短絡評価)。

そのため、実際の開発では、より true になる可能性が高い条件を論理和演算子の左側に配置することで、プログラムの実行時間を短縮することができます。

代入演算子

これまでの実験でも、代入演算子は頻繁に使用してきました。代入演算子の核心的な機能は、式の値を左辺のオペランド(操作対象)に代入することです。

左辺オペランド(Left-hand Operand):代入演算子(=)の左側にある、書き込み可能な式や変数のこと。

実際の開発では、ある変数に別の値を加算したり減算したりすることがよくあります。

これまでに学んだ知識では、以下のように記述します。

x = x + 1

このような処理は非常に一般的であるため、Go では以下のような短縮形式が提供されています。

x += 1

同様に、よく使われる代入演算子には以下のものがあります。

演算子 説明
= 基本的な代入演算子
+= 加算して代入
-= 減算して代入
*= 乗算して代入
/= 除算して代入
%= 剰余を代入

opePractice.go に以下のコードを記述してください。

package main

import "fmt"

func main() {
    x := 11
    fmt.Println("x の初期値:", x)
    x += 5 // x = x + 5 と同じ
    fmt.Println("x += 5 後の値:", x)
    x -= 5 // x = x - 5 と同じ
    fmt.Println("x -= 5 後の値:", x)
    x *= 5 // x = x * 5 と同じ
    fmt.Println("x *= 5 後の値:", x)
    x /= 5
    fmt.Println("x /= 5 後の値:", x)
    x %= 3
    fmt.Println("x %= 3 後の値:", x)
}

このコードでは、変数 x に初期値 11 を代入し、基本的な算術計算(加減乗除)と剰余計算を代入演算子を使って行っています。

コードを実行します。

cd ~/project
go run opePractice.go

変数の値を変更して、代入演算子がどのように動作するか確認してみてください。

まとめ

この実験で学んだ内容を復習しましょう。

  • 算術演算子の使い方
  • 比較演算子の使い方
  • 論理演算子の使い方
  • 代入演算子の使い方

この実験では、Go における演算子の使用方法について説明しました。さまざまな演算子とその具体的な活用例について理解を深めることができました。

✨ 解答を確認して練習