1. Home
  2. Golang
  3. GuideToBecomingGoDeveloper
  4. LearnTheBasics
  5. 変数と宣言(Variables and declaration) - Golang learning step 1-2

変数と宣言(Variables and declaration) - Golang learning step 1-2

  • 公開日
  • 更新日
  • カテゴリ:LearnTheBasics
  • タグ:Golang,roadmap.sh,学習メモ
変数と宣言(Variables and declaration) - Golang learning step 1-2

roadmap.sh > Go > Learn the Basics > Variables and declaration の学習を進めていきます。

※ 学習メモとしての記録ですが、反復学習の際の道しるべとなるよう、ですます調で記載しています。

contents

  1. 開発環境
  2. Variables and declaration(変数と宣言)
  3. 変数の宣言レベル
  4. 変数の宣言
  5. 変数と宣言まとめ

開発環境

  • チップ: Apple M2 Pro
  • OS: macOS Sonoma
  • go version: go1.23.2 darwin/arm64

Variables and declaration(変数と宣言)

Go の変数についてのセクションです。

変数とは、特定の型の値を格納するためにメモリ上の場所に与えられる名前のことです。Goでは、変数を宣言し使用するための複数の方法が提供されています。

変数の宣言レベル

Go では、var キーワードを使って変数を宣言します。変数宣言の構文では、型名が変数名の後に来るのが特徴。これは、型名が変数名の前に来る他の言語とは異なります。

変数は主に 2 つのレベルで宣言できます:

  1. パッケージレベル:関数の外部で宣言される変数で、そのパッケージ全体からアクセス可能。
  2. 関数レベル:関数内部で宣言される変数で、その関数のスコープ内でのみアクセス可能。

以下は、パッケージレベルと関数レベルの両方の変数宣言を示す例です。

package main

import "fmt"

// パッケージレベルの変数宣言
var グローバル変数 int

func main() {
    // 関数レベルの変数宣言
    var ローカル変数 string
    
    グローバル変数 = 42
    ローカル変数 = "こんにちは、Go!"
    
    fmt.Println(グローバル変数)
    fmt.Println(ローカル変数)
}
  • グローバル変数はパッケージレベルの int 型の変数。
  • ローカル変数は関数レベルの string 型の変数。

両方ともvarキーワードを使用して宣言され、型名が変数名の後に来ています。

これを、実際のプログラムで書いてみましょう。

package main

import "fmt"

// パッケージレベルの変数
var globalVar int = 10

func main() {
	// main 関数内のローカル変数
	var localVar int = 20

	fmt.Println("グローバル変数:", globalVar)
	fmt.Println("main 関数のローカル変数:", localVar)

	// 他の関数を呼び出す
	printGlobal()
	tryToAccessLocal()

	// ローカル変数の値を変更
	localVar = 30
	fmt.Println("変更後のmain関数のローカル変数:", localVar)
}

func printGlobal() {
	fmt.Println("printGlobal 関数内からのグローバル変数:", globalVar)
	// ここでlocalVarにアクセスしようとするとコンパイルエラーになります
	// fmt.Println(localVar) // この行をコメントアウトを外すとエラーになります
}

func tryToAccessLocal() {
	fmt.Println("tryToAccessLocal 関数内からのグローバル変数:", globalVar)
	// この関数内で新しいローカル変数を定義
	var localVar int = 100 // これはmain 関数の localVar とは別の変数です
	fmt.Println("tryToAccessLocal関数内の新しいローカル変数:", localVar)
}

このプログラムを実行すると、以下の出力が得られます。

グローバル変数: 10
main 関数のローカル変数: 20
printGlobal 関数内からのグローバル変数: 10
tryToAccessLocal 関数内からのグローバル変数: 10
tryToAccessLocal関数内の新しいローカル変数: 100
変更後のmain関数のローカル変数: 30

globalVar はパッケージレベルで宣言されており、すべての関数からアクセス可能です。main 関数, printGlobal 関数, tryToAccessLocal 関数から参照し出力できていることがわかります。

main 関数内で localVar というローカル変数を宣言しています。この変数は main 関数内でのみアクセス可能です。printGlobal 関数にコメントアウトしている箇所でこの localVar を出力しようとしている記述があります。これをコメントアウトを外すとコンパイルエラーになります。

# command-line-arguments
main.go:27:14: undefined: localVar

また、tryToAccessLocal 関数では、main 関数の localVar とは別の新しいローカル変数 localVar を宣言しています。これは完全に別の変数となり、main 関数の localVar とは無関係です。

そして、main 関数内で最後に localVar の値を変更していますが、これは他の関数には影響しません。

変数の宣言

Go 言語では、変数は明示的に宣言され、コンパイラによって使用されます。例えば、関数呼び出しの型の正確性をチェックするなどの目的で使用されます。

varキーワードは 1 つ以上の変数を宣言します。

var a = "initial"
fmt.Println(a)
// => initial

複数の変数を一度に宣言することができます。

var b, c int = 1, 2
fmt.Println(b, c)
// => 1 2

Go は初期化された変数の型を推論します。

var d = true
fmt.Println(d)
// => true

対応する初期化なしで宣言された変数はゼロ値になります。例えば、int 型のゼロ値は 0, string 型のゼロ値は空文字です。

var e int
fmt.Println(e)
// => 0
var f string
fmt.Println(f)
// => ''

:= 構文は、変数の宣言と初期化を行うための省略形です。この場合、var g string = "apple" と同じ意味になります。この構文は関数内でのみ使用可能です。

g := "apple"
fmt.Println(g)
// => apple

これらをまとめて実装し、実行してみます。

package main

import "fmt"

func main() {
	var a = "initial"
	fmt.Println(a)
	// => initial

	var b, c int = 1, 2
	fmt.Println(b, c)
	// => 1 2

	var d = true
	fmt.Println(d)
	// => true

	var e int
	fmt.Println(e)
	// => 0

	var f string
	fmt.Println(f)
	// => ''

	g := "apple"
	fmt.Println(g)
	// => apple
}

出力結果は以下になります。

initial
1 2
true
0

apple

変数と宣言まとめ

  • 変数は var キーワードを使って宣言
    • var <変数名> <型>
  • := 構文でも変数を宣言できる
  • 型を明記しない場合は推論される
  • 初期値を指定しなければゼロ値が代入される
  • 関数の外で宣言すればパッケージレベルの変数となる
  • 関数の中で宣言すればローカル変数となる

[Next] Step 1-3: データ型(Data Types)

[Prev] Step 1-1: Goセットアップと基本構文(Basic Syntax)

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級