この質問は、スライスへのポインタ。
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 サイトの他の関連記事を参照してください。