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アプリケーションの性能最適化

page_footer_responsive




-BackEnd
-

執筆者:

免責事項

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


comment

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

CAPTCHA


関連記事

Go言語

Goのfmt.print系関数のまとめ

1 はじめに2 print関数の命名規則3 各print関数の説明3.1 Print(標準出力へ出力)系関数3.2 Sprint(文字列を出力)系関数3.3 Fprint(ファイルへ出力)系関数4 書 ...

Pythonで書かれたスクレイピングのコードをRubyで書いてみる

1 はじめに2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 さいごに はじめに 以前、技術評論社さん ...

FastAPIのPath Operationをasync defにするときはブロッキングに気をつけよう!

1 はじめに2 Path Operationと並行処理3 挙動の確認4 対応方法4.1 asyncioを使って自力で非同期化する4.2 async対応済みのパッケージを使う4.3 async defを ...

Vue.js+TypeScriptな環境整備

1 はじめに2 vue-cliのインストール3 プロジェクトの作成3.1 機能の選択3.2 シンタックスの選択3.3 CSSプリプロセッサの設定3.4 Unit test3.5 E2E test3.6 ...

Go言語

Go言語 gocraft/workを使って常駐プロセスでジョブを処理させる

1 はじめに2 workの特徴3 workを使えるようにする3.1 Redisのインストール3.2 Go用のライブラリインストール4 Enqueue〜ジョブ実行まで4.1 Enqueue側4.2 ジョ ...

フォロー

blog-page_side_responsive

2025年4月
 12345
6789101112
13141516171819
20212223242526
27282930  

アプリ情報

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