Go言語の演算子を完全マスター!基本から応用まで一覧で徹底解説

Go

Go言語(Golang)は、シンプルでわかりやすい文法が特徴のプログラミング言語です。

その中でも「演算子」は、計算や条件判断、データ操作など、プログラミングのあらゆる場面で使われます。

でも、他のプログラミング言語とはちょっとちがう部分もあって、最初は戸惑うかもしれません。

この記事では、Go言語で使える演算子をわかりやすく一覧にまとめました。


スポンサーリンク

算術演算子

どんなもの?

算術演算子は、数の計算をするときに使う演算子です。

足し算や引き算はもちろん、ビット演算という特別な計算もできます。

演算子の一覧

演算子何をするか使い方の例結果の例(a=10, b=3の場合)
+足し算a + b13
-引き算a - b7
*掛け算a * b30
/割り算a / b3
%余りを求めるa % b1
&ビットANDa & b2
|ビットORa | b11
^ビットXORa ^ b9
&^ビットクリアa &^ b8
<<左シフトa << b80
>>右シフトa >> b1

ビット演算って何? ビット演算は、数を2進数(0と1だけ)で表したときの計算方法です。プログラミングでは、データを効率的に処理するために使われます。

実際に使ってみよう

package main

import "fmt"

func main() {
    a := 10
    b := 3
    
    // 基本的な計算
    fmt.Println("足し算:", a + b)  // 結果: 13
    fmt.Println("余り:", a % b)    // 結果: 1
    
    // ビット演算
    fmt.Println("ビットAND:", a & b)  // 結果: 2
}

ここがポイント!

  • 割り算(/)では、整数同士の場合は小数点以下が切り捨てられます
  • 余りを求める%は、割り切れない時の残りを教えてくれます
  • ビット演算は最初はむずかしく感じるかもしれませんが、慣れると便利です

比較演算子

どんなもの?

比較演算子は、二つの値を比べて「本当(true)」か「嘘(false)」かを教えてくれる演算子です。

条件分岐やループでよく使われます。

演算子の一覧

演算子何をするか使い方の例結果の例(a=5, b=10の場合)
==等しいa == bfalse
!=等しくないa != btrue
<より小さいa < btrue
<=以下a <= btrue
>より大きいa > bfalse
>=以上a >= bfalse

実際に使ってみよう

package main

import "fmt"

func main() {
    a := 5
    b := 10
    
    fmt.Println("aはbより小さい?", a < b)    // 結果: true
    fmt.Println("aとbは同じ?", a == b)      // 結果: false
    fmt.Println("aはbと違う?", a != b)      // 結果: true
}

ここがポイント!

  • ==は「同じかどうか」を調べます。代入の=とはちがうので注意!
  • !=は「ちがうかどうか」を調べます
  • <=>=は、等しい場合も含みます

論理演算子

どんなもの?

論理演算子は、複数の条件を組み合わせたり、条件を反対にしたりするときに使います。

「AかつB」「AまたはB」「Aではない」といった考え方です。

演算子の一覧

演算子何をするか使い方の例説明
&&かつ(AND)a && baもbも真のときだけ真
|または(OR)a | baかbのどちらかが真なら真
!ではない(NOT)!aaが真なら偽、偽なら真

実際に使ってみよう

package main

import "fmt"

func main() {
    a := true
    b := false
    
    fmt.Println("aかつb:", a && b)   // 結果: false
    fmt.Println("aまたはb:", a || b) // 結果: true
    fmt.Println("aではない:", !a)     // 結果: false
}

実用的な例

age := 20
hasLicense := true

// 18歳以上かつ免許を持っている場合
if age >= 18 && hasLicense {
    fmt.Println("運転できます")
}

ここがポイント!

  • &&は両方が真のときだけ真になります
  • ||はどちらか一方でも真なら真になります
  • !は真と偽をひっくり返します

代入演算子

どんなもの?

代入演算子は、変数に値を入れたり、すでにある値を変更したりするときに使います。

Go言語では、便利な省略記法もたくさんあります。

演算子の一覧

演算子何をするか使い方の例同じ意味
=代入a = b
:=宣言と同時に代入a := bvar a = b
+=足してから代入a += ba = a + b
-=引いてから代入a -= ba = a – b
*=掛けてから代入a *= ba = a * b
/=割ってから代入a /= ba = a / b
%=余りを求めてから代入a %= ba = a % b
&=ビットANDしてから代入a &= ba = a & b
|=ビットORしてから代入a |= ba = a | b
^=ビットXORしてから代入a ^= ba = a ^ b
&^=ビットクリアしてから代入a &^= ba = a &^ b
<<=左シフトしてから代入a <<= ba = a << b
>>=右シフトしてから代入a >>= ba = a >> b

実際に使ってみよう

package main

import "fmt"

func main() {
    // 基本的な代入
    a := 5  // 宣言と同時に代入
    
    // 演算してから代入
    a += 3  // a = a + 3 と同じ
    fmt.Println("a += 3の結果:", a)  // 結果: 8
    
    a *= 2  // a = a * 2 と同じ
    fmt.Println("a *= 2の結果:", a)  // 結果: 16
}

Go言語特有の:=について

// 従来の書き方
var name string = "太郎"

// Go言語の省略記法
name := "太郎"  // 型を自動で判断してくれる

ここがポイント!

  • :=は新しい変数を作るときだけ使えます
  • +=-=などは、計算と代入を一度にできて便利です
  • コードが短くなって、読みやすくなります

アドレス演算子(ポインタ)

どんなもの?

アドレス演算子は、コンピュータのメモリ上で変数がどこにあるかを扱う演算子です。ポインタという機能を使って、より効率的なプログラミングができます。

演算子の一覧

演算子何をするか使い方の例説明
&アドレスを取得する(アドレス演算子)p := &a変数aのメモリ上の住所を取得
*ポインタが指す値を取得する(デリファレンス)value = *pポインタpが指している値を取得

実際に使ってみよう

package main

import "fmt"

func main() {
    // 普通の変数
    a := 10
    fmt.Println("aの値:", a)
    
    // aのアドレス(住所)を取得
    p := &a
    fmt.Println("aのアドレス:", p)
    
    // ポインタが指している値を取得
    fmt.Println("ポインタが指す値:", *p)  // 結果: 10
    
    // ポインタ経由で値を変更
    *p = 20
    fmt.Println("変更後のaの値:", a)  // 結果: 20
}

実用的な例:関数での値の変更

package main

import "fmt"

// 値を直接変更する関数
func changeValue(p *int) {
    *p = 100
}

func main() {
    num := 50
    fmt.Println("変更前:", num)  // 結果: 50
    
    changeValue(&num)  // numのアドレスを渡す
    fmt.Println("変更後:", num)  // 結果: 100
}

ここがポイント!

  • &は「住所を教えて」という意味
  • *は「その住所にある値を教えて」という意味
  • ポインタを使うと、関数の中からでも元の変数を変更できます
  • 大きなデータを扱うときにメモリを節約できます

レシーブ演算子(チャネル)

どんなもの?

レシーブ演算子は、Go言語特有のチャネルという機能で使います。

チャネルは、異なる処理の間でデータをやり取りするための仕組みです。

演算子の一覧

演算子何をするか使い方の例説明
<-チャネルから値を受信value := <-chチャネルchから値を受け取る
<-チャネルに値を送信ch <- valueチャネルchに値を送る

実際に使ってみよう

package main

import "fmt"

func main() {
    // チャネルを作る
    ch := make(chan int)
    
    // 別の処理で値を送信
    go func() {
        ch <- 42  // チャネルに42を送る
    }()
    
    // チャネルから値を受信
    value := <-ch  // チャネルから値を受け取る
    fmt.Println("受信した値:", value)  // 結果: 42
}

より実用的な例

package main

import (
    "fmt"
    "time"
)

func worker(name string, ch chan string) {
    time.Sleep(1 * time.Second)  // 1秒待つ
    ch <- fmt.Sprintf("%sの作業完了", name)
}

func main() {
    ch := make(chan string)
    
    // 3つの作業を同時に開始
    go worker("作業A", ch)
    go worker("作業B", ch)
    go worker("作業C", ch)
    
    // 3つの結果を受信
    for i := 0; i < 3; i++ {
        result := <-ch
        fmt.Println(result)
    }
}

ここがポイント!

  • <-の向きに注目:ch <-は送信、<- chは受信
  • チャネルを使うと、複数の処理を同時に実行できます
  • Go言語の並行処理の核となる機能です

演算子の優先順位

どんなもの?

演算子の優先順位とは、複数の演算子が一緒に使われたときに、どれから先に計算するかを決める順番のことです。

算数の「掛け算・割り算は足し算・引き算より先」と同じ考え方です。

優先順位の一覧(高い順)

優先順位演算子覚え方
5* / % << >> & &^掛け算・割り算・ビット演算
4+ - | ^足し算・引き算
3== != < <= > >=比較
2&&かつ(AND)
1||または(OR)

実際の例で確認

package main

import "fmt"

func main() {
    // 掛け算が先に計算される
    result1 := 2 + 3 * 4
    fmt.Println("2 + 3 * 4 =", result1)  // 結果: 14 (2 + 12)
    
    // 比較がかつ(&&)より先に計算される
    a := 5
    b := 10
    result2 := a < b && b > 3
    fmt.Println("a < b && b > 3 =", result2)  // 結果: true
    
    // 括弧を使って順序を明確にする
    result3 := (2 + 3) * 4
    fmt.Println("(2 + 3) * 4 =", result3)  // 結果: 20
}

ここがポイント!

  • 優先順位が高い演算子ほど先に計算されます
  • わからないときは括弧()を使って順序を明確にしましょう
  • コードを読む人にとっても、括弧があると理解しやすくなります

まとめ

Go言語の演算子は、プログラムを作るうえでとても大切な要素です。それぞれの特徴をまとめてみましょう:

  • 算術演算子:計算やビット操作に使います。基本的な四則演算から、コンピュータならではのビット演算まで幅広く対応しています。
  • 比較演算子:値の大きさや等しさを調べます。条件分岐やループ処理で頻繁に使われる重要な演算子です。
  • 論理演算子:複数の条件を組み合わせるときに使います。「かつ」「または」「ではない」の3つを覚えておけば大丈夫です。
  • 代入演算子:変数に値を入れたり更新したりします。Go言語の:=+=などの省略記法を使うと、コードがすっきりします。
  • アドレス演算子:ポインタを使った効率的なプログラミングができます。最初はむずかしく感じるかもしれませんが、慣れると便利です。
  • レシーブ演算子:Go言語特有のチャネル機能で使います。並行処理プログラムを作るときに欠かせません。
  • 演算子の優先順位:複雑な計算式でも正しく処理できるよう、順序を理解しておきましょう。

これらの演算子をマスターすることで、Go言語でのプログラミングがもっと楽しく、効率的になります。

最初はすべてを覚える必要はありません。よく使うものから少しずつ慣れていきましょう!

コメント

タイトルとURLをコピーしました