HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: go, golang, аллокация, make</p>
1 <p>Теги: go, golang, аллокация, make</p>
2 <p>В языке программирования<strong>Go</strong>существует встроенная функция make(T, args). По своему назначению она отличается от функции new(T) и создает лишь срезы, каналы и карты, возвращая инициализированное значение типа T(не *T).</p>
2 <p>В языке программирования<strong>Go</strong>существует встроенная функция make(T, args). По своему назначению она отличается от функции new(T) и создает лишь срезы, каналы и карты, возвращая инициализированное значение типа T(не *T).</p>
3 <p>Дело в том, что вышеперечисленные три типа представляют под капотом линки на структуры данных, которые необходимо инициализировать перед применением. К примеру, срез (slice) -- это не что иное, как дескриптор из 3-х элементов, который содержит указатель на данные, длину и емкость, а пока эти элементы не станут инициализированными, срез будет равняться<strong>nil</strong>. При этом для срезов, каналов и карт<strong>make</strong>инициализирует внутреннюю структуру данных, подготавливая значение для использования.</p>
3 <p>Дело в том, что вышеперечисленные три типа представляют под капотом линки на структуры данных, которые необходимо инициализировать перед применением. К примеру, срез (slice) -- это не что иное, как дескриптор из 3-х элементов, который содержит указатель на данные, длину и емкость, а пока эти элементы не станут инициализированными, срез будет равняться<strong>nil</strong>. При этом для срезов, каналов и карт<strong>make</strong>инициализирует внутреннюю структуру данных, подготавливая значение для использования.</p>
4 <p>Рассмотрим пример:</p>
4 <p>Рассмотрим пример:</p>
5 <p>Функция в вышеприведенном примере аллоцирует массив из 100 int'ов, после чего создает структуру среза длиной 10/вместимостью 100, указывающую на первые десять элементов массива (следует понимать, что при создании среза емкость можно опустить). Тогда как new([] int), напротив, возвращает указатель на вновь выделенную обнуленную структуру среза, то есть возвращает указатель на значение<strong>nil</strong>-фрагмента.</p>
5 <p>Функция в вышеприведенном примере аллоцирует массив из 100 int'ов, после чего создает структуру среза длиной 10/вместимостью 100, указывающую на первые десять элементов массива (следует понимать, что при создании среза емкость можно опустить). Тогда как new([] int), напротив, возвращает указатель на вновь выделенную обнуленную структуру среза, то есть возвращает указатель на значение<strong>nil</strong>-фрагмента.</p>
6 <p>Для окончательного понимания разницы между функциями<strong>new</strong>и<strong>make</strong>, рассмотрим еще один пример:</p>
6 <p>Для окончательного понимания разницы между функциями<strong>new</strong>и<strong>make</strong>, рассмотрим еще один пример:</p>
7 <p>Остается отметить, что функция<strong>make</strong>применяется лишь к картам, каналам и срезам, то есть она<strong>не возвращает указатель</strong>. Таким образом, если вы хотите получить явный указатель, следует воспользоваться функцией<strong>new</strong>либо выбрать адрес переменной явно.</p>
7 <p>Остается отметить, что функция<strong>make</strong>применяется лишь к картам, каналам и срезам, то есть она<strong>не возвращает указатель</strong>. Таким образом, если вы хотите получить явный указатель, следует воспользоваться функцией<strong>new</strong>либо выбрать адрес переменной явно.</p>
8 <p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
8 <p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
9  
9