Странная особенность Срезов (go version go1.7.4 windows/386)

53 views
Skip to first unread message

Vladimir Zagura

unread,
Jan 11, 2017, 6:17:51 AM1/11/17
to Golang Russian
Всем добрый день, начал изучать Go, натолкнулся на странное поведение при перенарезке среза.
Если перенарезка выполняется с начальным индексом равным нулю или не указанным, то поведение слайса ожидаемо, если же начальный индекс перенарезки больше нуля, то слайс перенарезается со сдвигом.
Так и должно быть?
 
Код приложен в файле.

Вывод программы:

slice = [0 1 2 3 4 5 6 7 8 9]

slice[:1] = [0]

slice[:1] = [0]

slice[:1] = [0]


slice[0:1] = [0]

slice[0:1] = [0]

slice[0:1] = [0]


slice[1:2] = [1]

slice[1:2] = [2]

slice[1:2] = [3]

Успех: процесс завершился с кодом 0.



main.go

Oleg Bulatov

unread,
Jan 11, 2017, 7:07:38 AM1/11/17
to Golang Russian
Подобные примеры кода лучше через play.golang.org скидывать, это у остальных потребует меньше усилий для запуска кода.

Если выводить еще len(gth) и cap(acity) [1], то должно стать чуть понятнее что происходит. Там сдвигается начало слайса на 1 элемент. Длина при этом 1, но capacity — весь оставшийся массив.

Но в целом обычно это плохая практика из слайса из одного элемента (с индексом 0) пытаться вытащить элемент, которого там нет (в данном случае с индексом 1).

[1]: https://play.golang.org/p/SnpJ57bKYh

Evgeny Khabarov

unread,
Jan 11, 2017, 7:13:43 AM1/11/17
to gola...@googlegroups.com
Привет!

Так и должно быть, т.к. слайс по сути это кусок массива на котором он
основан и содержит указатели на этот самый массив. Соответственно, при
выполнении кода

slice = slice[0:1]

указатель не меняется, а при выполнении

slice = slice[1:2]

указатель сдвигается на первый элемент, при повторном выполнении на второй и
т.д. Пример https://play.golang.org/p/upUoklHb5L

Подробнее про устройство слайсов и массивов
https://blog.golang.org/go-slices-usage-and-internals

--
Евгений.
> --
> Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com
> /d/optout.


Reply all
Reply to author
Forward
0 new messages