В Go есть два примитива выделения памяти: встроенные функции new и make. Они работают совершенно по разному и применяются для разных задач.
> new(T) - встроенная функция, которая выделяет память, обнуляет ее и возвращает на нее указатель. Используется, в основном, для получения указателей на такие структуры, где не требуется начальная инициализация полей.
> make(T, args) - создает только срезы, мапы и каналы и возвращает инициализированное значение типа T (А НЕ *T). Причина в том что эти три типа и так представляют собой ссылки на структуры данных. И они должны быть инициализированы перед использованием. Например, срез - трехкомпонентный дескриптор, содержащий указатель на данные, длину и емкость. Пока эти элементы не инициализированы, срез равен nil. Для срезов, мап и каналов функция make инициализирует внутреннюю структуру данных (принятыми args) и подготавливает значение к использованию.
> new(T) - встроенная функция, которая выделяет память, обнуляет ее и возвращает на нее указатель. Используется, в основном, для получения указателей на такие структуры, где не требуется начальная инициализация полей.
> make(T, args) - создает только срезы, мапы и каналы и возвращает инициализированное значение типа T (А НЕ *T). Причина в том что эти три типа и так представляют собой ссылки на структуры данных. И они должны быть инициализированы перед использованием. Например, срез - трехкомпонентный дескриптор, содержащий указатель на данные, длину и емкость. Пока эти элементы не инициализированы, срез равен nil. Для срезов, мап и каналов функция make инициализирует внутреннюю структуру данных (принятыми args) и подготавливает значение к использованию.
READ OTHER POSTS