ホームページ  >  記事  >  バックエンド開発  >  `reflect.MakeSlice` がアドレス指定できない `Value` を返すのはなぜですか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-08 05:36:01984ブラウズ

Why does `reflect.MakeSlice` return an un-addressable `Value`?

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

この質問は、スライスへのポインタ。

reflect.MakeSlice がアドレス指定不可能な値を返すのはなぜですか値?

Go におけるアドレス指定可能性の大まかな定義は、何かのアドレスを取得でき、このアドレスが意味のある場所を指していることが保証されることです。関数本体のスタックに何かを割り当てると、割り当てられた値のアドレスには、ある時点でアクセスできなくなります。したがって、この値はアドレス指定できません。

ほとんどの場合、Go はローカル スタック変数が返されるか外部に昇格されるとヒープに移動しますが、実行時にはこれは行われません。したがって、CanAddr() は次の場合にのみ true を返します。

  A value is addressable if it is an element of a slice, an element of an addressable array, a field of an addressable struct, or the result of dereferencing a pointer.

記述された型にはすべて共通点があります。それは、保持しているものがどこからでもアクセス可能であり、メモリ内の意味のある値を指すことが保証されているということです。 Reflect.MakeSlice を使用してローカル スライスを作成したため、スライス要素もポインタも、その他の前述のものもありません。ただし、スライスの要素はアドレス指定可能です (スライスのメモリはヒープ上に存在するため)。

リフレクションを使用してスライスへのポインタを取得する方法

最も簡単な解決策は、おそらくリフレクトを使用することです。 .New() でポインターを作成します (再生中の完全な例):

my := &My{}

// Create a slice to begin with
myType := reflect.TypeOf(my)
slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10)

// Create a pointer to a slice value and set it to the slice
x := reflect.New(slice.Type())
x.Elem().Set(slice)

collection.Find(bson.M{}).All(x.Interface())

指摘された x.Interface() に注目してください。他の回答でも同様です。これにより、reflect.Value の代わりに x の実際の値が All().

に渡されることが防止されます。

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

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