ホームページ >バックエンド開発 >Golang >「reflect.MakeSlice」関数がアドレス指定できない値を返すのはなぜですか?

「reflect.MakeSlice」関数がアドレス指定できない値を返すのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-08 07:46:02436ブラウズ

Why is the `reflect.MakeSlice` Function Returning an Un-Addressable Value?

reflect.MakeSlice がアドレス指定できない値を返す理由

Go では、reflect パッケージは、型と値を検査および操作するためのインターフェイスを提供します。 Reflect.MakeSlice は、指定されたタイプのスライスを作成します。ただし、戻り値はアドレス指定できません。これは、アドレスを取得したり、ポインタに割り当てたりすることができないことを意味します。

解決策: Reflect.New() を使用する

リフレクションを使用してアドレス指定可能なスライスを取得するには、次のようにします。スライスへのポインタを作成するには、reflect.New() 関数を使用できます。これは次のように実行できます。

これで、スライス ポインタを必要とする関数に引数として渡すことができる、アドレス指定可能なスライスが完成しました。

なぜリフレクトするのか。 MakeSlice がアドレス指定できない値を返す

ランタイムが移動する可能性があるため、Go のローカル スタック変数はアドレス指定できませんそれらはいつでもヒープに追加されます。 reflect.MakeSlice はローカル スライス変数を作成するため、戻り値はアドレス指定できません。

スライスへのポインタが必要な理由

一部の API、たとえばmgo パッケージで言及したものと同様に、引数としてスライスへのポインタが必要です。これは、スライスに追加する際に、容量を増やした新しいスライスが割り当てられる可能性があるためです。非ポインター スライスを渡す場合、スライスに加えられた変更は関数の外部には表示されません。

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

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