IT заметки по программированию
IT заметки по программированию
IT заметки по программированию
IT заметки по программированию

Golang, как передаются слайсы в функцию, по ссылке или по значению?

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

Структура слайсов в Go

Слайс в Go — это структура, состоящая из трех полей:

  1. Указатель на массив (под капотом у слайса всегда есть массив, на который он указывает).
  2. Длина слайса — количество элементов, которые доступны в слайсе.
  3. Вместимость слайса — максимальное количество элементов, которые могут быть добавлены без перераспределения памяти.

Когда слайс передается в функцию, создается копия структуры слайса (по значению). Однако эта копия содержит указатель на тот же массив данных, что и оригинал. Поэтому изменения, касающиеся самих элементов слайса (например, slice[0] = 42), будут видны и за пределами функции, так как оба слайса ссылаются на один и тот же массив данных.

Важное исключение: append

Когда используется функция append, Go может изменить внутренний массив, если текущей вместимости не хватает. При этом append вернет новый слайс с новым указателем на массив. Если результат append не присвоен обратно в переменную, изменения не сохранятся вне функции.

Пример

В этом примере:

  • Изменение s[0] = 99 видно в main, так как slice и s указывают на один массив.
  • append(s, 42) создает новый массив (так как не хватает вместимости), но результат не присваивается обратно в slice, поэтому slice в main не меняется.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *