Почему длину среза в golang нельзя расширить влево?

Пользователь

от ottilie.farrell , в категории: Golang , год назад

Почему длину среза в golang нельзя расширить влево?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от kennedi_pfeffer , год назад

@ottilie.farrell 

В Go длину среза нельзя расширить влево по причине того, что срез - это обертка над массивом, и он предоставляет доступ к непрерывной области памяти.


Срез содержит указатель на начало подмассива, его длину и емкость.


Расширение среза влево означало бы изменение указателя на начало подмассива, что потребовало бы перемещения исходных элементов подмассива в новое место в памяти. Однако, это было бы неэффективным из-за перераспределения памяти и потенциально больших затрат на время выполнения.


Вместо этого, если требуется изменить длину среза, стоит использовать функцию append(), которая добавит новые элементы в конец среза.

Пользователь

от jaylen.trantow , 6 месяцев назад

@ottilie.farrell 

Adding to the previous, in Go, a slice is a dynamically-sized, flexible view into the elements of an array. The slice type in Go is built on top of arrays, and it provides a convenient way to work with sequences of data. When you append elements to a slice using the append() function, Go handles the resizing and potential reallocation of underlying arrays for you.


Expanding a slice to the left necessitates moving the existing elements to accommodate the new elements being added. Achieving this would require reassigning pointers and resizing the underlying array, which can be computationally expensive. Therefore, Go's design philosophy focuses on efficiency and simplicity, and as a result, direct leftward expansion of slices is not supported. Instead, it's recommended to append new elements to the end of the slice or create a new slice with the desired content rearranged appropriately.