Pull to refresh

Comments 7

Картинка к «Передача (слайса) по ссылке» может запутать, так как после присвоения оба слайса становятся полностью независимыми play.golang.org/p/7_SqvjGKPDE
Не становятся.
В вашем примере «независимыми» их делает append — который создаёт новый слайс на основе переданного и добавляемых элементов: play.golang.org/p/xI1nlgjKH4t
Мне кажется срезы не совсем не правильно описано, что приведет в заблуждение новичков. Почитайте книгу Алана Долована «Язык программирования Go». Срез всегда ссылается «под капотом» на массив, по этому он всегда будет «ссылкой»(не указателем в go). Если вы расширяете срез и он больше чем массив «под капотом», то «под капотом» создастся новый массив требуемой длинны и срез теперь будет указывать на него. Но если срез будет уменьшаться, то массив не будет пересоздан, можно узнать так как вы показывали len и cap. На этом можно ловить баги.

Может я ошибаюсь или неправильно понял статью. Вот пример play.golang.org/p/ENpGACeRrFn

И можно сразу указывать длину массива, при создании среза, что бы потом не пересоздавать массивы — make([]int, 0, 10)

В Go нету ссылок.
Слайс в Go — это структура, где одно из полей это указатель на массив:


type slice struct {
   array unsafe.Pointer
   len   int
   cap   int
}

https://golang.org/src/runtime/slice.go

Есть у меня предположение, что в последнем квадратике адрес должен быть 16-ричным:
картинка
image

0x414020 0x414024 0x414028 0x41402C
Знаю, что перевод…

upd: заметил, что в некоторых других картинках тоже есть подобные ошибки.
Sign up to leave a comment.