「reflect.MakeSlice」で作成されたスライスがアドレス指定できないのはなぜですか?

Patricia Arquette
リリース: 2024-11-12 08:13:02
オリジナル
503 人が閲覧しました

Why is a Slice Created with `reflect.MakeSlice` Not Addressable?

Reflect.MakeSlice がアドレス指定できない値を返すのはなぜですか?

Go では、アドレス指定可能性とは、変数のメモリ アドレスを取得し、その有効性を保証する機能を指します。 。ローカル スタック変数はアドレス指定できません。この概念は、reflect.MakeSlice を使用して作成された値に適用されます。

reflect.MakeSlice を使用する場合は、新しいスライス値を作成します。ただし、この値は既知のアドレスを持つメモリ位置には保存されません。代わりに、スタック上に一時的に存在します。スタック フレームが破棄されるとアドレスが無効になるため、このスタックに割り当てられた値を使用してスライスへのポインタを作成することはできません。

アドレス指定可能なスライス値の取得

この問題を解決するには、アドレス指定可能なスライス値を取得するには、reflect.New() を使用できます。この関数はスライスへのポインターを作成します。

myType := reflect.TypeOf(my)
slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10)
x := reflect.New(slice.Type()).Elem()
x.Set(slice)
ログイン後にコピー

x.Elem() 呼び出しはポインターを逆参照し、実際のスライス値を返します。これを使用して All() メソッドに渡すことができます。

Go のアドレス可能性を理解する

Go 言語仕様によれば、値は次の場合にアドレス指定可能です。

  • スライスの要素
  • アドレス指定可能な配列の要素
  • アドレス指定可能な構造体のフィールド
  • ポインターの逆参照の結果

reflect.MakeSlice の場合、新しく作成されたスライスはスタック上に存在し、永続的なメモリの場所に保存されていないため、これらの基準のいずれも満たしません。

以上が「reflect.MakeSlice」で作成されたスライスがアドレス指定できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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