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 言語仕様によれば、値は次の場合にアドレス指定可能です。
reflect.MakeSlice の場合、新しく作成されたスライスはスタック上に存在し、永続的なメモリの場所に保存されていないため、これらの基準のいずれも満たしません。
以上が「reflect.MakeSlice」で作成されたスライスがアドレス指定できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。