BackEnd

Go 1.24で追加されたweak pointer

投稿日:

はじめに

前回の記事では、Go 1.24での変更点についていくつか列挙し、その中でomitzeroタグについて紹介しました。

今回はその続きとして、weak pointerに付いて書きたいと思います。

weak pointerとは

まず初めに、weak pointerについて簡単に説明します。

変数への参照にはいくつか種類があり、その中でも強参照(strong reference)と弱参照(weak reference)は様々なプログラミング言語で用いられています。

Goにおいては、強参照の格納場所をpointerと呼び、今回新たに追加された弱参照の格納場所をweak pointerと呼びます。

pointerとweak pointer

これら2つ(strongかweakか)は読んで字のごとく、参照の強さが異なります。

具体的にどう違うかというと、pointerによる参照が残っている場合はGCの対象にはならないため、変数のスコープが終了するまではメモリ上に残ります。

それとは逆に、weak pointerによる参照が残っている場合ではGCの対象になる場合があります。

つまり、weak pointerによる参照先は、知らないうちにメモリ上から開放される可能性があります。

weak pointerが有効なケース

weak pointerが力を発揮するものとして真っ先に挙げられるのがキャッシュです。

pointerでキャッシュしている場合、明示的に参照先をnilにするなどして参照元をなくさない限りメモリ上に残り続けるため、キャッシュが増えれば増えるほどメモリを圧迫していきます。

pointerの代わりにweak pointerを使えば、メモリを使用する量が一定を超えれば自動的に開放されるため、メモリをより効率的に使うことができます。

weak pointerを使う上での注意点

このように使い方によっては非常に強力なweak pointerですが、いくつか注意する点があります。

  1. 参照先の値を取得する際には必ずnilチェックする
  2. weak pointerを多様しない
  3. 複数のgoroutineから参照される場合では、ロックやsync.Mapを使う

1については、いつGCによって参照先が開放されるかわからないので、値を参照する前には参照先がnilでないか必ずチェックすることが望ましいです。

2については、weak pointerは特定の役割においては強力ですが、何にでも使えるようなものではないので、多様は禁物です。

3については、pointerにも言えることですが、goroutineなどで同時に更新されるような場合では注意が必要です。

weak pointerを使ったキャッシュの実装

それでは、実際にweak pointerを使って簡単なキャッシュプログラムを書いてみます。

コードの全体像

まずは、コード全体をお見せします。

このコードを実行すると以下のようなログが出力されます。

このプログラムでは、始めにキャッシュを作成し、キャッシュに値をセットします。

その後、goroutineを起動し、その中の無限ループ内でキャッシュから値の取得を試みます。

キャッシュから値を取得できた場合はそれを出力し、取得できなかった場合はループを抜けます。

同時に無限ループ内の中でカウントアップし、3回目の実行時にGCを呼び出します。

GCが呼び出された事により、キャッシュ内のweak pointerで参照していたメモリが開放されるため、それ以降はキャッシュから値を取得できなくなり、goroutineが終了します。

weak pointerの作成

weak pointerの作成は weak.Make 関数で行うことができます。

引数に渡す値は、pointerであれば何でも渡すことができます。

weak pointerから値を取得する

weak pointerからの値の取得は、 Value メソッドを使って行います。

この際、参照先がnilでないか必ずチェックするようにしましょう。

さいごに

weak pointerの概要と使い方について紹介しました。

おすすめ書籍

シリコンバレー一流プログラマーが教える Goプロフェッショナル大全 実践!Go言語とgRPCで学ぶマイクロサービス開発 (設計技術シリーズ126) 効率的なGo ―データ指向によるGoアプリケーションの性能最適化

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

麻雀で自分が何を切るか学習させる

1 はじめに2 プロジェクト名を決めてみる3 何切る問題で考慮される要素3.1 手牌3.2 ドラ3.3 考慮していない要素(本当は入れたい)4 学習の方法5 さいごに はじめに 前回執筆しました、配牌 ...

Go言語

go 1.24の tool directive でツールを管理する

1 はじめに1.1 これまでのツールの管理方法2 tool directiveを使ってツールを管理する2.1 ツールの追加2.2 ツールの削除3 go tool コマンドでツールを実行する4 さいごに ...

PHPerだけどKotlinを勉強したって良いよね その2〜コンストラクタ編〜

1 はじめに2 コンストラクタ2.1 プライマリコンストラクタ2.2 セカンダリコンストラクタ2.3 ニックネームのみを入力した人2.4 ニックネームと email を入力した人2.5 Faceboo ...

Go言語

GoでStructのAccessorを自動生成する

1 はじめに2 Accessorを自動生成する2.1 基本的な使い方2.2 receiver変数を変更する場合2.3 生成するファイル名を変える場合2.4 排他制御を行い場合3 どのように生成している ...

rails

半年ぶりにRails Tutorialをやったメモ

はじめに Railsを触り始めて半年ほどたちました、tonnyです。 復習もかねてRails Tutorialを実施したので、そのメモを残します。 やはり2回目でも気づくことは多いので、非常に勉強にな ...

フォロー

blog-page_side_responsive

2025年4月
 12345
6789101112
13141516171819
20212223242526
27282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。