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


関連記事

laravel logo

Inertia使ってみた①

1 はじめに2 Inertiaとは3 ルーティング4 LaravelからReactに値渡し5 レスポンス5.1 初回5.2 page object5.3 2回目以降5.4 リロード時6 さいごに7 お ...

Go言語

Go 1.19でGoDocに追加された機能

1 はじめに2 GoDocの機能追加2.1 セクションタイトル(Headings)2.2 リンク2.3 リスト2.4 パッケージの追加3 おまけ4 さいごに5 おすすめ書籍 はじめに 8月2日にGo ...

rails

Shrineを使って画像をアップロードする

1 はじめに2 Shrineとは2.1 簡単な説明2.2 作者2.3 特徴3 下準備3.1 Gemを追加3.2 初期設定3.3 テーブルを作成する4 実装4.1 Uploaderの実装4.2 Mode ...

Stripe Connectを使って継続課金を実装

1 はじめに2 商品・価格の登録2.1 マイグレーション2.2 製品・価格登録処理の実装2.3 Stripe管理画面での確認3 サブスクリプション登録3.1 事前準備3.2 課金処理の実装3.3 St ...

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

フォロー

blog-page_side_responsive

2025年4月
 12345
6789101112
13141516171819
20212223242526
27282930  

アプリ情報

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