🔍

Go言語の省略変数宣言に使われる演算子`:=`の由来は?

2024/10/29に公開

はじめに

Goのプログラミングにおいて特徴的な構文の一つである「:=」は、新しい変数の宣言と初期化を同時に行える便利な演算子です。しかし、この:=の構文の由来を考えたことはありますか?

この記事では、この:=演算子の歴史的ルーツをたどり、Go言語の設計思想に基づいた解釈を紹介します。👋 過去の言語からの影響を知ることで、Go言語の背景をより理解できるでしょう。


:=の基本的な使い方

Go言語では、:=を使って変数を宣言しながら同時に初期化します。

package main

import "fmt"

func main() {
    message := "Hello, World!"
    number := 42
    fmt.Println(message, number)
}

この例では、messagenumber:=によって宣言され、それぞれ文字列と整数として初期化されています。Goはこのシンプルな表現で簡潔な変数宣言を実現しています。

この変数宣言および初期化をプログラミング言語Goでは「省略変数宣言」と呼んでいます。この記事では省略変数宣言に用いる演算子 := を省略変数宣言演算子呼びます。

Go言語のルーツ

省略変数宣言演算子のルーツについてお話しする前に少しだけGo言語のルーツに触れたいと思います。

下記の図では各ブロックが言語を表していて、矢印の先がそのブロックの言語の影響先を表しています。

省略変数宣言演算子のルーツ💡

先ほどの図でも見たように Algol 60は、多くの現代言語の基礎を築いた言語です。この言語で、:=は変数への代入を意味しました。

そして、Algolからの影響を受けたPascalも、同じく:=を代入演算子として採用しました。Pascalは過去に教育用言語として広く使われており、当時としては簡潔で明確な文法が特徴でした。

以上から、Goの省略変数宣言演算子は、1960年代のAlgol 60およびその後のPascalといった古典的な言語の影響を受けています。これらの言語では、:=は代入を表す演算子として利用されていました。一方でGoでは代入ではなく宣言の意味も含まれています。


省略変数宣言の注意点 🛠️

  • シャドーイングに注意: 同じスコープ内で誤って変数を再宣言してしまうことがあります。これをシャドーイングと呼びます。
    以下の例では、同じ名前の変数が異なるスコープで使用されています。
x := 1
if x := 2; x > 1 {
    fmt.Println(x) // 2が表示される
}
fmt.Println(x) // 1が表示される

おわりに

Goの省略変数宣言演算子は、AlgolやPascalといった歴史的なプログラミング言語の影響を受けつつ、現代の開発環境に適した形に進化しました。

🐢 これから、Goでプログラミングをする際に、たまには省略変数宣言演算子の背後にある歴史とその利便性を思い出してください。過去から受け継がれてきたシンプルなアイデアが、今も私たちの手元で役立っているのです。

Discussion