ホームページ  >  記事  >  バックエンド開発  >  Go 言語変数のライフサイクルは何ですか?

Go 言語変数のライフサイクルは何ですか?

青灯夜游
青灯夜游オリジナル
2023-01-10 17:05:152117ブラウズ

Go 言語では、変数のライフサイクルとは、プログラムの実行中に変数が効果的に存在する時間間隔を指します。グローバル変数のライフ サイクルは、プログラム全体の実行サイクルと一致しますが、ローカル変数のライフ サイクルは、変数を作成する宣言ステートメントから始まり、変数が参照されなくなるまで動的です。

Go 言語変数のライフサイクルは何ですか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go 言語変数のライフ サイクル

変数のライフ サイクルとは、変数が効果的に実行される時間間隔を指します。プログラムの実行中に存在します。

変数のライフ サイクルは、変数のスコープと切り離せない関係にあります。

  • グローバル変数: そのライフ サイクルと全体の実行サイクルプログラムは一貫しています;

  • ローカル変数: そのライフサイクルは動的であり、変数を作成する宣言ステートメントから始まり、変数が参照されなくなるまでです。

  • 仮パラメータと関数戻り値: これらはすべてローカル変数であり、関数が呼び出されたときに作成され、関数呼び出しが完了すると破棄されます。

for t := 0.0; t < cycles*2*math.Pi; t += res {
    x := math.Sin(t)
    y := math.Sin(t*freq + phase)
    img.SetColorIndex(
        size+int(x*size+0.5), size+int(y*size+0.5),
        blackIndex, // 最后插入的逗号不会导致编译错误,这是Go编译器的一个特性
    )               // 小括号另起一行缩进,和大括号的风格保存一致
}

上記のコードでは、一時変数 t が各ループの先頭で作成され、その後、一時変数 x と y が各ループ反復で作成されます。一時変数 x と y はスタックに格納され、関数の実行が終了すると (実行が最後の } に遭遇すると)、そのメモリは解放されます。

スタックとヒープの違いは次のとおりです:

  • ヒープ: ヒープは、プロセスの実行中に動的に割り当てられるメモリ セグメントを格納するために使用されます。サイズは固定されておらず、動的に拡大または縮小できます。プロセスが malloc などの関数を呼び出してメモリを割り当てると、新しく割り当てられたメモリがヒープに動的に追加されます (ヒープは拡張されます)。 free などの関数を使用してメモリを解放すると、解放されたメモリはヒープから削除されます (ヒープが削減されます);

  • Stack (スタック): スタックはスタックとも呼ばれます一時的に作成されるローカル変数は、関数の中括弧 { } で定義されたローカル変数です。

プログラムのコンパイル段階で、コンパイラは、変数が宣言されているかどうかに関係なく、実際の状況に応じてスタックまたはヒープ上のローカル変数用の記憶域スペースを割り当てることを自動的に選択します。 var または new キーワードを使用してコンパイラの選択に影響します。

var global *int
func f() {
    var x int
    x = 1
    global = &x
}
func g() {
    y := new(int)
    *y = 1
}

上記のコードでは、関数 f の変数 x は、関数内で定義されているにもかかわらず、関数終了後もパッケージ レベルのグローバル変数を通じて見つけることができるため、ヒープ上に割り当てる必要があります。 。 Go 言語の用語で言えば、このローカル変数 x は関数 f からエスケープされます。

逆に、関数 g が戻ると、変数 *y は使用されなくなり、すぐに再利用できることになります。したがって、*y は関数 g からエスケープしません。コンパイラは *y の記憶領域をスタックに割り当てるか、ヒープに割り当てるかを選択でき、その後 Go 言語の GC (ガベージ コレクション メカニズム) がこの変数のメモリを再利用します。

実際の開発では、変数のエスケープ動作を意図的に実装する必要はありません。エスケープされた変数には追加のメモリ割り当てが必要であり、パフォーマンスの最適化が微妙な影響を与える可能性があるためです。

Go 言語はメモリの割り当てと解放に役立ちますが、高パフォーマンスのアプリケーションを開発するには、変数の宣言サイクルを理解する必要があります。たとえば、ローカル変数をグローバル変数に割り当てると、GC がローカル変数をリサイクルできなくなり、不必要なメモリ使用量が発生し、プログラムのパフォーマンスに影響を及ぼします。

【関連する推奨事項: Go ビデオ チュートリアル プログラミング教育

以上がGo 言語変数のライフサイクルは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。