«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему функция «reflect.MakeSlice» возвращает неадресуемое значение?

Почему функция «reflect.MakeSlice» возвращает неадресуемое значение?

Опубликовано 10 ноября 2024 г.
Просматривать:103

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

Почему Reflection.MakeSlice возвращает неадресуемое значение

В Go пакет отражения предоставляет интерфейс для проверки и управления типами и значениями. Reflection.MakeSlice создает фрагмент заданного типа. Однако возвращаемое значение не адресуется. Это означает, что вы не можете получить его адрес или присвоить его указателю. можно использовать функцию отражения.New() для создания указателя на срез. Это можно сделать следующим образом:

// Создайте тип среза срезТип:= отражение.SliceOf(SomeType) // Создаем фрагмент, используя Reflection.MakeSlice срез: = отражения.MakeSlice(sliceType, 10, 10) // Создаём указатель на срез срезPtr:= отражения.Новый(slice.Type()) // Устанавливаем указатель среза на срез слайсPtr.Elem().Set(slice)Теперь у вас есть адресный срез, который можно передать в качестве аргумента функциям, которым требуется указатель среза.

Зачем размышлять. MakeSlice возвращает неадресуемое значение
// Create the slice type
sliceType := reflect.SliceOf(SomeType)

// Create a slice using reflect.MakeSlice
slice := reflect.MakeSlice(sliceType, 10, 10)

// Create a pointer to the slice
slicePtr := reflect.New(slice.Type())

// Set the slice pointer to the slice
slicePtr.Elem().Set(slice)

Локальные переменные стека в Go не адресуются, поскольку среда выполнения может в любой момент переместить их в кучу время. Reflection.MakeSlice создает локальную переменную среза, поэтому возвращаемое значение не адресуется.

Почему требуется указатель на срез

Некоторые API, например как тот, который вы упомянули в пакете mgo, в качестве аргумента требуется указатель на срез. Это связано с тем, что при добавлении к срезу может быть выделен новый срез с увеличенной емкостью. Если вы передадите срез без указателя, изменения, внесенные в срез, не будут видны за пределами функции.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3