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

Почему в Go происходит перезапись переменных при добавлении к срезам одного и того же массива?

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

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Причина перезаписи переменных в Go

Ваш код сталкивается с проблемой перезаписи переменных, поскольку вы создаете новые фрагменты (pathA и pathB), добавляя элементы в один и тот же резервный массив (маршрут) внутри цикла.

Справочная информация о срезах в Go:

  • Срез Go — это структура данных, которая представляет собой непрерывный блок элементов того же типа.
  • Срезы имеют длину (количество хранящихся в данный момент элементов) и емкость (максимальное количество элементов, которые он может содержать).
  • При изменении среза может сработать выделение нового резервного массива в случае превышения емкости.

Проблема с вашим кодом:

В вашем коде вы создаете два новых фрагмента, pathA и pathB, используя функцию добавления:

pathA := append(route, nextA)
pathB := append(route, nextB)

Вот что происходит:

  1. Первоначально маршрут имеет емкость, которая может вместить как nextA, так и nextB. Таким образом, два новых фрагмента (pathA и pathB) создаются с тем же резервным массивом, что и маршрут.
  2. По мере выполнения цикла и продолжения добавления к маршруту его емкость в конечном итоге превышает его длину.
  3. На следующей итерации цикла для маршрута выделяется новый резервный массив. Однако pathA и pathB по-прежнему ссылаются на старый резервный массив.
  4. Когда вы добавляете nextB к маршруту, он записывает последний элемент старого резервного массива, который является общим как для pathA, так и для pathB.
  5. В результате и путь A, и путь B получают одно и то же конечное значение.

Решение:

Чтобы избежать такой перезаписи, вам необходимо убедитесь, что pathA и pathB имеют уникальные резервные массивы. Этого можно добиться, вручную создав новый фрагмент для одного из них с помощью make и copy:

newRoute := make([]int, len(route), (cap(route) 1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}
Заявление о выпуске Эта статья перепечатана по адресу: 1729727920. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3