Почему 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