Функция Go sort. reverse возвращает указатель?
в настоящее время я изучаю go и сейчас нахожусь в этой точке курса. пакет сортировки кажется хорошей вещью для изучения не только потому, что вы можете сортировать вещи, но и потому, что интерфейс "интерфейс" необходим для выполнения некоторой работы.
(tl;dr: прочитайте следующий абзац, проверьте фрагмент исходного кода, а затем прокрутите вниз и продолжите чтение с жирной строки)
теперь я понятия не имел, что происходит, когда вы делаете обратную сортировку. я думал, что "sort.Reverse" перевернул элементы, а затем вы передаете его в "sort.Sort", и это казалось излишним. Итак, я отправился к источнику и нашел этот драгоценный камень в сортировать.перейти[^] (строка 291-293):
func Reverse(data Interface) Interface { return &reverse{data} }
я немного поиграл здесь[^] чтобы увидеть, что произойдет, если я верну указатель на свою структуру или просто структуру без указателя.
сегодня на работе я прошелся по интернету, но не смог найти никого, кто обращался бы к этому фрагменту кода. однако я нашел много разговоров о "escape-анализе", который заключается в том, как компилятор go вычисляет, должно ли значение идти в стек, если оно может быть отброшено при возврате функции, или же к этому значению все еще нужно будет получить доступ после завершения функции, что затем приведет к его помещению в кучу. эта оптимизация сделана для вас.
это заставило меня задуматься:
является ли это "унаследованным" фрагментом кода (фрагмент выше)? это то, как они сделали это, чтобы гарантировать, что структура не будет отброшена после возврата функции? в бите go playground, который я добавил, Я вернул структуру, а затем изменил ее на указатель на структуру, но независимо от того, какой из них я вернул, базовый фрагмент строки все равно изменил свое первое значение. срезы являются ссылочными типами, поэтому, если есть ссылка на этот срез в функции, вызывающей "sort.Reverse", действительно ли необходимо возвращать указатель на структуру, в которую он завернут?
я действительно понимаю причину, по которой они оборачивают срез в структуру, но бит указателя-это то, на чем мой ум застрял со вчерашнего вечера (я думаю, что даже мечтал об этом).
есть ли у меня здесь правильная идея, или я слишком много думаю?
о! это просто пришло мне в голову перед тем, как я написал:
структура sort. reverse не экспортируется (не заглавная буква), однако вам все равно нужно использовать эту структуру для обратной сортировки. ответ на мою головную боль так же прост, как "поскольку элемент не экспортируется, и вам все равно нужно иметь к нему доступ, структура помещается в кучу, и вы получаете указатель на нее, к которому затем можете получить свободный доступ"?
я думаю, что пойду и расширю свой фрагмент кода golang playground и запихну вещи в модули, чтобы проверить эту теорию... если только кто-нибудь не опередит меня в объяснениях.
Обновление:
ладно, нет, это не из-за экспорта. я вернулся к своей первой идее анализа побега.
Что я уже пробовал:
глядя на источник голанга, гуглясь, и теперь я снова попытаюсь разобраться в этом самостоятельно.