# аллокация, создание срезов (slice), карт (map) и каналов

**Аллокация**

Встроенная функция **new** принимает тип T, выделяет память для переменной этого типа во время выполнения и возвращает значение типа \*T, указывающее на него. Переменная инициализируется, нулевым значением для своего типа.

```
new(T)
```

Например

```
type S struct { a int; b float64 }
new(S)
```

выделяет память для переменной типа S, инициализирует ее (a=0, b=0.0) и возвращает значение типа \*S, содержащее адрес расположения переменной в памяти.

**Создание срезов (slice), карт (map) и каналов**

Встроенная функция **make** принимает тип T, который должен быть типом среза, карты или канала, за которым может следовать список выражений, зависящий от типа. Возвращает значение типа T (не \*T). Память инициализируется, как описано в посте о начальных значениях.

```
Вызов            Тип T      Результат

make(T, n)       slice      срез среза типа T с длиной n и емкостью n
make(T, n, m)    slice      срез среза типа T с длиной n и емкостью m

make(T)          map        карта типа T
make(T, n)       map        карта типа T с начальным пространством для приблизительно n элементов

make(T)          channel    небуферизованный каналом типа T
make(T, n)       channel    небуферизованным каналом типа T, размер буфера n
```

Каждый из аргументов размера n и m должен иметь целочисленный тип или нетипизированную константу. Аргумент постоянного размера должен быть неотрицательным и представимым значением типа int; если это нетипизированная константа, ей присваивается тип int. Если оба n и m заданы и являются постоянными, то n должно быть не больше m. Если n отрицательно или больше чем m во время выполнения, возникает паника во время выполнения.

```
s := make([]int, 10, 100)       // срез с len(s) == 10, cap(s) == 100
s := make([]int, 1e3)           // срез с len(s) == cap(s) == 1000
s := make([]int, 1<<63)         // недопустимо: len(s) не представимо значением типа int
s := make([]int, 10, 0)         // недопустимо: len(s) > cap(s)
c := make(chan int, 10)         // канал с размером буфера 10
m := make(map[string]int, 100)  // карта с начальным пространством приблизительно для 100 элементов
```

Вызов **make** с **a** с типом **map** и размером карты **n** создаст карту с начальным пространством для хранения **n** элементов карты. Точное поведение зависит от реализации.
