golang "Ссылочные" типы данных - срезы, хэш-таблицы, каналы. Неявная передача указателя в функции

В golang нет ссылок, но есть указатели, тем не менее, поведение рассматриваемых тут типов очень похоже на поведение "ссылочных типов" в других языках.

К "ссылочным" (условно говоря) типам данных в golang-е можно отнести всё те же:

  1. срезы
  2. карты (хэш-таблицы)
  3. и каналы

Это означает, что при передаче значения в функцию даже без явного получения указателя на переменную, по факту всё равно передается указатель и работа производится далее с оригинальным значением до тех пор, пока аргумент-указатель не окажется "переключенным" на другую область памяти

Отличие от ссылочных типов: Когда происходит "переключение" указателя

  1. При любой переаллокации памяти (типа расширения слайса через append, выходом за вместимость)
  2. При явном присваивании аргументу функции нового значения уже в теле функции

-- в этих ситуациях поведение указателя отличается от поведения "ссылки", если по ссылке изменился бы оригинальный объект, то тут указатель просто начинает смотреть на новую память, никак не трогая страю (как в ситуации, например, с переаллокацией для срезов)

Дополнительные материалы