ホームページ > バックエンド開発 > Golang > Go の混合代入と宣言で変数シャドーイングはどのように発生しますか?

Go の混合代入と宣言で変数シャドーイングはどのように発生しますか?

DDD
リリース: 2024-12-22 04:43:11
オリジナル
466 人が閲覧しました

How Does Variable Shadowing Occur in Go's Mixed Assignments and Declarations?

Golang の混合代入と宣言における変数のシャドウイング

Go で := 演算子を使用すると、値を代入するときに予期しない動作が発生する可能性があります。変数。宣言と代入を同時に行うことができますが、変数のシャドウイングが発生する可能性もあります。

変数のシャドウイング

内部スコープ内の既存の変数で := が使用される場合、新しい値と型がその変数に関連付けられます。これは、元の変数がそのスコープ内で事実上隠蔽されることを意味します。

デモ

a := 1
{
    a, b := 2, 3
}
// This code will result in a compiler error because 'a' is already declared in the outer scope.
ログイン後にコピー

この例では、内部スコープは変数 a を再宣言しようとします。は外側のスコープですでに宣言されています。これは許可されていないため、コンパイラ エラーが発生します。

解決策

変数のシャドウイングを回避するには、いくつかの方法があります。

  • すべての変数を宣言する
  • 別の変数を使用してください
  • 新しいスコープを作成し、後で使用できるように元の変数の値を保存します。

一貫性のない動作

この問題は次の場所でも発生する可能性があります。内部スコープで変数を気づかずに宣言するとリバースしてしまうit.

デモ

if _, err := fmt.Println(n); err != nil {
    panic(err)
}
// This code will result in a compiler error because 'err' is undefined.
ログイン後にコピー

この例では、err 変数は宣言されていますが、内部スコープで初期化されていません。ただし、外側のスコープは初期化されることを想定しています。

解決策

  • 内側のスコープであっても、使用する前にすべての変数を宣言します。
  • 代入と if ステートメントを分離して回避する

混合代入と宣言

混合代入と宣言の場合、新しいスコープは作成されません。したがって、シャドウイングは発生しません。

デモ

a := 1
fmt.Println(&a)
a, b := 2, 3
fmt.Println(&a)
// This code will print the same address for 'a' in both cases.
ログイン後にコピー

この例では、変数 b が宣言されて値が割り当てられ、同時に既存の変数 b の値が割り当てられます。変数aが変更されます。 a のアドレスは同じままであり、シャドウイングが発生しなかったことを示しています。

以上がGo の混合代入と宣言で変数シャドーイングはどのように発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート