カテゴリ: Go言語 更新日: 2025/12/08

Go言語のスコープとは?ローカル変数・グローバル変数の違いと使い分け

Go言語のスコープとは?ローカル変数・グローバル変数の違いと使い分け
Go言語のスコープとは?ローカル変数・グローバル変数の違いと使い分け

先生と生徒の会話形式で理解しよう

生徒

「Go言語って、どこで変数を宣言するかで何か違いがあるんですか?」

先生

「いい質問ですね。変数には『スコープ』と呼ばれる、どこから見えるか(使えるか)の範囲があります。Go言語でも、スコープはとても大事な考え方なんですよ。」

生徒

「スコープって難しそうですけど、簡単に教えてもらえますか?」

先生

「もちろんです!実際のコードと一緒に、ローカル変数とグローバル変数の違いをやさしく解説していきましょう。」

1. Go言語の「スコープ」とは?

1. Go言語の「スコープ」とは?
1. Go言語の「スコープ」とは?

Go言語(Golang)でプログラムを書くとき、「変数(へんすう)」をどこで宣言するかによって、その変数がどこから見えるのか(使えるのか)が変わります。この見える範囲のことをスコープと呼びます。スコープは、プログラムの読みやすさや安全性にも関わる大切な概念です。

イメージとしては、「この部屋の中だけで使えるもの」と「家のどこでも使えるもの」の違いに近いです。範囲が狭いものは扱いやすく、範囲が広いものは便利ですが、使い方に注意が必要になります。


package main

import "fmt"

func main() {
    local := "ここだけの値" // main関数の中だけで使える
    fmt.Println(local)
}

このサンプルでは、localという変数はmain関数の中だけで使えます。関数の外からは見えないため、安全に扱える「限定されたスコープ」を持つ変数の例になっています。まずは、この“使える範囲が決まっている”というイメージをつかむことが、スコープを理解する第一歩です。

2. ローカル変数とは?関数の中だけで使える変数

2. ローカル変数とは?関数の中だけで使える変数
2. ローカル変数とは?関数の中だけで使える変数

ローカル変数(local variable)とは、特定の関数やブロック(かたまり)の中だけで使える変数です。外からは見えません。これは、個室の中にあるものと同じで、部屋の外からは見えないし触れません。

以下は、関数の中でローカル変数を使っている例です。


package main

import "fmt"

func sayHello() {
    message := "こんにちは"
    fmt.Println(message)
}

func main() {
    sayHello()
    // fmt.Println(message) はエラーになります(messageは関数内のローカル変数だから)
}

このコードでは、messageという変数はsayHello関数の中だけで使えます。main関数からは見えないため、fmt.Println(message)のように書くとエラーになります。

3. グローバル変数とは?どこからでも使える変数

3. グローバル変数とは?どこからでも使える変数
3. グローバル変数とは?どこからでも使える変数

グローバル変数(global variable)は、プログラム全体で使える変数です。関数の外で定義することで、すべての関数から見えるようになります。

これは、家族全員が使えるリモコンのようなもので、リビングでもキッチンでも使える共有アイテムのようなものです。


package main

import "fmt"

var greeting = "やあ!" // グローバル変数

func sayHi() {
    fmt.Println(greeting)
}

func main() {
    sayHi()
    fmt.Println(greeting)
}

このコードでは、greetingは関数の外で宣言されています。そのため、sayHi関数の中でもmain関数の中でも使えます。

4. ローカル変数とグローバル変数の使い分け

4. ローカル変数とグローバル変数の使い分け
4. ローカル変数とグローバル変数の使い分け

「じゃあ、全部グローバル変数にすれば便利じゃない?」と思うかもしれませんが、それには注意が必要です。グローバル変数をたくさん使うと、どの関数がその変数を変更したのかわかりにくくなります。

ローカル変数は、使う場所が限定されているため、安全でバグ(プログラムの間違い)も起きにくいです。

【使い分けのポイント】

  • 一時的に使うだけの値 → ローカル変数
  • 複数の関数で共有したい値 → グローバル変数(でも使いすぎ注意)

5. スコープの基本ルールを図解で理解

5. スコープの基本ルールを図解で理解
5. スコープの基本ルールを図解で理解

ここで、簡単なスコープの図をイメージしてみましょう。

  • グローバルスコープ(関数の外)→ 全体から見える
  • 関数スコープ(関数の中)→ その関数だけで見える
  • ブロックスコープ(if文など)→ その中だけで見える

たとえば、次のようなコードでは、スコープの違いがよくわかります。


package main

import "fmt"

var globalVar = "グローバル"

func main() {
    localVar := "ローカル"

    if true {
        blockVar := "ブロック内"
        fmt.Println(globalVar) // OK
        fmt.Println(localVar)  // OK
        fmt.Println(blockVar)  // OK
    }

    // fmt.Println(blockVar) はエラーになります(ifの中の変数だから)
}

6. スコープの重なりに注意しよう

6. スコープの重なりに注意しよう
6. スコープの重なりに注意しよう

スコープが重なっていると、同じ名前の変数があっても「内側のスコープ」が優先されます。これを「変数のシャドーイング(shadowing)」と呼びます。


package main

import "fmt"

var name = "外の名前"

func main() {
    name := "内の名前"
    fmt.Println(name) // → "内の名前" が表示されます
}

このように、内側で同じ名前の変数を作ると、外の変数は隠れてしまいます。混乱を防ぐために、同じ名前をむやみに使わないことが大切です。

7. Go言語のスコープはとても大切

7. Go言語のスコープはとても大切
7. Go言語のスコープはとても大切

Go言語のプログラミングでは、変数のスコープを正しく理解して使い分けることがとても重要です。

  • ローカル変数は安全で、使いやすい
  • グローバル変数は便利だけど、使いすぎに注意
  • スコープを理解すると、バグを減らしやすくなる

最初は少し難しく感じるかもしれませんが、コードを書きながら少しずつ慣れていきましょう。

まとめ

まとめ
まとめ

今回の記事では、Go言語のプログラミングにおける重要な概念である「スコープ」について、ローカル変数とグローバル変数の違いを中心に解説しました。Go言語はシンプルで効率的なプログラミング言語ですが、変数のスコープを正しく理解して使い分けることは、コードの可読性や保守性、そしてバグを防ぐうえで欠かせない知識です。特に初心者がつまずきやすいのは、「変数がどこで見えるのか」「関数の外と中で何が違うのか」といった部分ですが、このスコープのルールを押さえておけば安心です。

ローカル変数は、関数やブロックの中だけで使える変数です。外部から見えないため安全性が高く、プログラムの意図を明確に表すことができます。例えば、一時的な計算結果や処理の中だけで必要な値はローカル変数を使うべきです。逆にグローバル変数は、複数の関数からアクセスできる便利な変数ですが、使い方を誤るとどこで値が変更されたのか追いにくくなるため注意が必要です。

また、Go言語ではスコープの重なりによって「シャドーイング」が起きることも学びました。同じ名前の変数が内側で宣言されると外側の変数が隠れてしまうため、名前の付け方には工夫が必要です。これは実際のプロジェクト開発においてもよく問題になる部分なので、覚えておくと役立ちます。

プログラムを分かりやすく、安全に書くためには、スコープのルールを活かして「適切な場所で適切な変数を使う」ことが大切です。Go言語はスコープの仕組みがシンプルで直感的なので、サンプルコードを動かしながら繰り返し学ぶことで自然と身についていくでしょう。

サンプルプログラム:スコープを意識したコード

次のサンプルコードは、ローカル変数とグローバル変数の違いをまとめたものです。


package main

import "fmt"

// グローバル変数
var globalMessage = "グローバルなメッセージ"

func showMessage() {
    // ローカル変数
    localMessage := "ローカルなメッセージ"
    fmt.Println(localMessage)
    fmt.Println(globalMessage)
}

func main() {
    showMessage()

    // fmt.Println(localMessage) // エラー:関数外からは見えない
    fmt.Println(globalMessage) // OK
}

このプログラムでは、globalMessageはプログラム全体で利用できるグローバル変数ですが、localMessageshowMessage関数の中でしか利用できません。こうしたスコープの違いを理解して使い分けることが、Go言語で効率的なプログラムを書くための基本です。

スコープの理解が役立つ場面

実際の開発では、スコープを理解していると次のようなメリットがあります。

  • 関数ごとに独立した処理が書けるため、バグが少なくなる
  • コードの意図が明確になり、他人が読んでも理解しやすい
  • 変数の名前の衝突を避けやすくなる
  • 不要なグローバル変数を減らせるため、保守性が向上する

こうした点からも、スコープを正しく理解して使い分けることは、Go言語に限らずすべてのプログラミング言語に共通して大切な考え方だといえます。

先生と生徒の振り返り会話

生徒

「先生、スコープについて色々学びましたが、やっぱりローカル変数を使うのが基本なんですね?」

先生

「その通りです。ローカル変数を基本にし、必要なときだけグローバル変数を使うのが良い習慣です。スコープを意識すれば、コードの安全性も上がります。」

生徒

「なるほど!グローバル変数は便利だけど、使いすぎると混乱の元になるんですね。」

先生

「そうですね。例えば設定値のように複数の関数で共有する必要があるときには使えますが、それ以外はローカル変数を中心にしたほうが安全です。」

生徒

「これからコードを書くときには、変数のスコープをしっかり意識してみます!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Go言語のスコープとは何ですか?初心者でも理解できるように簡単に説明してほしいです。

Go言語のスコープとは、変数や定数が「どこから見えるのか」「どこで使えるのか」を決めるルールのことです。プログラム全体から見えるグローバルスコープ、関数の中だけで見える関数スコープ、if文やfor文などの中だけで使えるブロックスコープがあります。

Go言語でローカル変数とはどんな特徴がありますか?

ローカル変数は特定の関数やブロックの中だけで使える変数です。外からアクセスできないため、安全でバグも少なく、処理を明確に分けたいときに便利です。
関連記事:
カテゴリの一覧へ
新着記事
Go言語の構造体でインターフェースを実装する方法を初心者向けにやさしく解説!
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
Go言語の文字列フォーマット!fmt.Sprintfで簡単に出力を整形する方法
Go言語のエラーと例外の違いを初心者向けに整理!わかりやすく解説
人気記事
No.1
Kotlin・Go・Swift記事の人気No1
Swiftのwhile文とrepeat while文を完全マスター!初心者にもわかる繰り返し処理の使い方と違い
No.2
Kotlin・Go・Swift記事の人気No2
Swift入門ガイド|基本構文と書き方をマスターしよう
No.3
Kotlin・Go・Swift記事の人気No3
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Kotlin・Go・Swift記事の人気No4
Kotlinの正規表現(Regex)の使い方をやさしく解説!文字列操作の基本を初心者向けに学ぼう
No.5
Kotlin・Go・Swift記事の人気No5
Kotlinのコンパニオンオブジェクトとは?初心者向けに使い方と役割をわかりやすく解説!
No.6
Kotlin・Go・Swift記事の人気No6
Kotlinで画面を作る!レイアウトXMLとビューの基本操作をやさしく解説
No.7
Kotlin・Go・Swift記事の人気No7
Kotlinのwhen式を完全ガイド!初心者でもわかるパターンマッチング的な使い方
No.8
Kotlin・Go・Swift記事の人気No8
Swiftのオプショナル型とは?初心者でもわかる使い方とアンラップの基礎