0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語(Golang)の、変数のスコープとメモリアドレス

Posted at
	ok, result := true, "A"

	fmt.Printf("memory address of result: %p\n", &result)
	if ok {
		result := "B"
		fmt.Printf("memory address of result: %p\n", &result)
		println(result)
	} else {
		result := "C"
		println(result)
	}

	println(result)

このGo言語のコードは、変数のスコープとメモリアドレスの取得に関する例です。

ok, result := true, "A"
fmt.Printf("memory address of result: %p\n", &result)
  1. 変数の初期化:

    • okresult という2つの変数を同時に初期化しています。oktrueresult"A" という文字列です。
    • := 演算子を使っているため、これらの変数は新たに宣言されます。
  2. メモリアドレスの表示:

    • fmt.Printf を使って result のメモリアドレスを表示しています。&resultresult のアドレスを取得し、%p フォーマットを指定してポインタ形式で出力します。
if ok {
	result := "B"
	fmt.Printf("memory address of result: %p\n", &result)
	println(result)
} else {
	result := "C"
	println(result)
}
  1. 条件分岐:

    • if ok の条件が true なので、if ブロック内が実行されます。
    • result := "B" で新たに result という変数を宣言し、スコープが if ブロック内に限定されます。この resultA とは異なる変数です。
  2. 再びメモリアドレスの表示:

    • 新しく宣言した result のメモリアドレスを表示します。これは B を指します。
  3. println の実行:

    • println(result)B が出力されます。
  4. else ブロック:

    • else ブロックは実行されませんが、else の中でも同様に result := "C" とすると、新たに result が定義され、そのスコープは else ブロック内に限られます。
println(result)
  1. 最終的な出力:
    • println(result)if ブロックの外にあるため、最初に定義した result(つまり "A")が出力されます。この時、if ブロックで宣言した result はスコープ外になっているため、影響を与えません。

まとめ

  • result は最初に "A" として定義され、if ブロック内で新たに result"B" として定義されていますが、これは別の変数です。
  • if ブロック外での println(result) は最初の "A" を表示します。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?