Язык Go — кратко. Часть 5. Указатели

В языке Go есть три вида переменных — обычные (значения чисел, строк, массивы), ссылочные (срезы и мапы) и указатели. Кратенько рассмотрим отличия.

Обычные переменные — это просто переменные, хранящие конкретное значение. При передаче в функцию для таких переменных создаётся копия. Для строк, правда, иначе — их скорее правильно рассматривать как ссылочные неизменяемые переменные.

Ссылочные переменные — это срезы и мапы. Выглядят и используются они довольно просто, а вот внутри у них сокрыта небольшая «магия» (например, внутри у среза указатель на массив), которая позволяет экономить память и время при передаче переменной в функцию. Т.к. в функцию передаётся не копия, а именно сама переменная, у вас есть возможность изменить её содержимое.

Указатели — классические указатели на место в памяти, где хранятся данные. Полезны для передачи в и из функции чего-то крупного. Надо передать массив — делаем через указатель. Надо выдать из функции много полей результата — лучше создать для этого срез (если все однотипные) или структуру с нужными полями и вернуть указатель (для структуры; для среза достаточно вернуть сам срез). В общем, как и везде, указатель полезен для снижения затрат на передачу крупных данных.

Общие принципы:

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

 

Leave a Reply

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