コンテンツにスキップ

Go/=

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goにおける 区切り子 = は、代入文 として基本的な役割を果たしますが、Go特有の 短縮変数宣言多重代入 などの文脈で重要な意味を持ちます。以下に具体的に解説します。

区切り子 = の基本

[編集]
代入文としての =
var x int
x = 42        // 基本的な代入
var name string
name = "Go"   // 文字列の代入
  • =右辺の値を左辺の変数に代入 する最も基本的な演算子です
  • 左辺は 書き込み可能な変数 でなければなりません
初期化での使用
var count int = 10      // 宣言時の初期化
var message string = "Hello"  // 型指定あり

短縮変数宣言における =

[編集]

Goの特徴的な機能として、:= と組み合わせて使われる短縮変数宣言があります。

:= との関係
// 短縮変数宣言(関数内でのみ使用可能)
x := 42        // var x int = 42 と同等
name := "Go"   // var name string = "Go" と同等

// 既存変数への代入
x = 100        // 既に宣言済みの変数への代入
混在パターン
// 一部が新しい変数、一部が既存変数
var err error
result, err := someFunction()  // result は新規、err は既存

多重代入における =

[編集]
複数変数の同時代入
var a, b, c int
a, b, c = 1, 2, 3  // 多重代入

// 関数の複数戻り値
value, ok := myMap["key"]
data, err := os.ReadFile("file.txt")
変数の交換
a, b := 10, 20
a, b = b, a    // 変数の値を交換(Go特有の簡潔な書き方)

特殊な用途での =

[編集]
ブランク識別子 _ との組み合わせ
_, err := os.Open("file.txt")  // 戻り値の一部を無視
value, _ := strconv.Atoi("123") // エラーを無視(推奨されない)
構造体フィールドの代入
type Person struct {
    Name string
    Age  int
}

var p Person
p.Name = "Alice"  // フィールドへの代入
p.Age = 30
配列・スライスの要素代入
var arr [5]int
arr[0] = 10      // 配列要素への代入

slice := make([]int, 3)
slice[1] = 20    // スライス要素への代入
マップの要素代入
m := make(map[string]int)
m["key"] = 42    // マップへの値の設定

複合代入文

[編集]

= は他の演算子と組み合わせて複合代入文を形成します。

算術演算子との組み合わせ
var x int = 10
x += 5    // x = x + 5 と同等(x は 15)
x -= 3    // x = x - 3 と同等(x は 12)
x *= 2    // x = x * 2 と同等(x は 24)
x /= 4    // x = x / 4 と同等(x は 6)
x %= 5    // x = x % 5 と同等(x は 1)
ビット演算子との組み合わせ
var flags uint8 = 0b1010
flags |= 0b0001   // OR代入
flags &= 0b1110   // AND代入
flags ^= 0b1111   // XOR代入
flags <<= 2       // 左シフト代入
flags >>= 1       // 右シフト代入
文字列の連結
var message string = "Hello"
message += " World"  // 文字列の連結代入

他の言語との比較

[編集]
C言語
  • = は代入演算子として基本的に同じ
  • 多重代入や短縮変数宣言の概念はない
Python
  • = は代入文
  • 多重代入 a, b = 1, 2 は可能だが、型宣言は不要
JavaScript
  • = は代入演算子
  • letconst による宣言が別途必要
Go
  • = は代入専用
  • := による短縮変数宣言が特徴的
  • 型安全性が厳密に保たれる

注意点とベストプラクティス

[編集]
代入と等価性の混同を避ける
// 代入文
x = 5

// 等価性チェック(比較演算子)
if x == 5 {
    // 処理
}
未初期化変数への代入
var x int     // x は 0 で初期化される
x = 42        // 問題なし

// var y int   // 宣言を忘れると...
// y = 42      // エラー: undefined: y
型の不一致
var x int = 42
var y float64 = 3.14
// x = y     // エラー: 暗黙的な型変換は不可
x = int(y)   // 明示的な型変換が必要
定数への代入
const PI = 3.14159
// PI = 3.14  // エラー: 定数は変更不可

パフォーマンスに関する考慮

[編集]
大きなデータ構造の代入
type LargeStruct struct {
    Data [1000]int
}

var a, b LargeStruct
b = a  // 全データがコピーされる(値渡し)

// ポインタを使った効率的な代入
var p *LargeStruct = &a
// p を使って間接的にアクセス
スライスの代入
slice1 := []int{1, 2, 3}
slice2 := slice1  // スライスヘッダーのコピー(浅いコピー)

まとめ

[編集]
  • Goの =「代入文」 として、値の代入や変数の更新に使用されます
  • 短縮変数宣言 := と組み合わせることで、Go特有の簡潔な変数宣言が可能です
  • 多重代入 により、複数の変数を同時に操作でき、特に関数の複数戻り値の処理で威力を発揮します
  • 複合代入文との組み合わせで、コードの可読性と効率性を向上させます
  • 型安全性が厳密に保たれ、暗黙的な型変換によるバグを防げます

= は単なる代入記号ではなく、Goの 『型安全性』と『表現力』を支える基盤』 として、言語設計の哲学を体現しています!