← Назад к вопросам

Какие типы данных создаются при помощи Make?

2.0 Middle🔥 201 комментариев
#Другое#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы данных, создаваемые с помощью make

В языке Go встроенная функция make используется для инициализации и создания трех конкретных типов встроенных (composite) данных: срезов (slices), карт (maps) и каналов (channels). Эти типы являются ссылочными типами (reference types), и их прямое объявление через var или с использованием литерала создает nil-значение, которое в большинстве случаев не готово к непосредственному использованию. Функция make выделяет память в куче (heap) и инициализирует внутренние структуры данных, возвращая готовый к работе экземпляр.

1. Срезы (Slices)

Срез — это динамический массив, состоящий из указателя на массив, длины (length) и вместимости (capacity). make позволяет создать срез с предопределенными размером и вместимостью, что важно для оптимизации производительности (избежание лишних аллокаций памяти при последующих операциях append).

Синтаксис:

// Создание среза длины 5 и вместимости 10
slice := make([]int, 5, 10)

// Если вместимость не указана, она равна длине
slice2 := make([]string, 3) // len=3, cap=3

Пример:

package main

import "fmt"

func main() {
    // Создаем срез целых чисел длиной 3, все элементы инициализированы нулями
    nums := make([]int, 3)
    fmt.Println(nums)        // [0 0 0]
    fmt.Println(len(nums))   // 3
    fmt.Println(cap(nums))   // 3

    // Создаем срез с длиной 2 и вместимостью 5
    dynamic := make([]int, 2, 5)
    fmt.Println(dynamic)     // [0 0]
    fmt.Println(cap(dynamic)) // 5
}

2. Карты (Maps)

Карта — это неупорядоченная коллекция пар "ключ-значение". make создает инициализированную карту, готовую для вставки элементов, в отличие от nil-карты, которая вызовет панику при попытке добавления данных.

Синтаксис:

// Создание карты с ключами типа string и значениями int
m := make(map[string]int)

// Можно указать начальный размер (capacity hint) для оптимизации
m2 := make(map[string]bool, 100)

Пример:

package main

import "fmt"

func main() {
    // Создаем карту для хранения возрастов
    ages := make(map[string]int)
    ages["Alice"] = 30
    ages["Bob"] = 25
    fmt.Println(ages) // map[Alice:30 Bob:25]

    // Сравнение с nil-картой
    var nilMap map[string]int
    // nilMap["test"] = 1 // panic: assignment to entry in nil map
}

3. Каналы (Channels)

Канал — это механизм для связи между горутинами (goroutines), обеспечивающий синхронизацию и передачу данных. make создает инициализированный канал, который можно использовать для отправки и получения значений.

Синтаксис:

// Создание небуферизованного канала для целых чисел
ch := make(chan int)

// Создание буферизованного канала с емкостью буфера 10
chBuffered := make(chan string, 10)

Пример:

package main

import (
    "fmt"
    "time"
)

func main() {
    // Небуферизованный канал
    ch := make(chan int)
    go func() {
        ch <- 42 // Отправка значения
    }()
    value := <-ch // Получение значения
    fmt.Println(value) // 42

    // Буферизованный канал
    bufCh := make(chan string, 2)
    bufCh <- "Hello"
    bufCh <- "World"
    fmt.Println(<-bufCh, <-bufCh) // Hello World
}

Ключевые отличия make от new

  • make работает только со срезами, картами и каналами, возвращая инициализированный готовый к использованию экземпляр (не nil).
  • new выделяет память для любого типа и возвращает указатель на нулевое значение этого типа (например, *int, *MyStruct).
  • Пример с new:
ptr := new(int) // ptr имеет тип *int, значение *ptr равно 0
slicePtr := new([]int) // Возвращает *[]int, но сам срез nil — для использования обычно нужен make

Итог

Функция make является критически важным инструментом в Go для работы с динамическими структурами данных: срезами, картами и каналами. Она обеспечивает их правильную инициализацию, управление памятью и производительность. Использование make вместо прямого объявления позволяет избежать распространенных ошибок, связанных с nil-значениями, и является идиоматическим подходом в Go-разработке.

Какие типы данных создаются при помощи Make? | PrepBro