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言語のクロージャーとシャドーイングの影響

Posted at

Golangにおけるクロージャーは、関数が他の関数のスコープ内で定義され、その外部の変数にアクセスできる機能を指します。これにより、関数内で外部の変数を保持したり、状態を持たせたりすることが可能になります。

クロージャーの基本

クロージャーは、以下のように定義されます。

package main

import "fmt"

func main() {
    x := 10
    increment := func() int {
        x++
        return x
    }

    fmt.Println(increment()) // 11
    fmt.Println(increment()) // 12
}

この例では、increment関数がxという外部変数にアクセスし、値をインクリメントしています。incrementはクロージャーであり、xを「閉じ込めて」いるため、呼び出すたびにxの値が保持され、更新されます。

シャドーイングの影響

シャドーイングは、同じ名前の変数が異なるスコープで再定義されることで発生します。Golangでは、内側のスコープの変数が外側のスコープの変数を隠します。これにより、意図しない動作を引き起こすことがあります。

以下にシャドーイングの例を示します。

package main

import "fmt"

func main() {
    x := 10

    increment := func() int {
        x := 5 // ここでシャドーイングが発生
        x++
        return x
    }

    fmt.Println(increment()) // 6
    fmt.Println(x)           // 10 (外側のxは変更されていない)
}

この例では、increment関数内で新たにxが定義されているため、外部のxは影響を受けず、increment内でのxは5から6に増加します。外部のxはそのまま10のままです。

まとめ

  • クロージャーは外部の変数にアクセスできる関数です。
  • シャドーイングは、内側のスコープで変数名を再定義することで外側の変数に影響を与えない現象です。
  • クロージャーを使用する際は、シャドーイングによる意図しない影響を考慮することが重要です。
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?