Функция make

Функция make предназначена для создания и инициализации срезов (slice), карт (map) и каналов (chan). В отличие от new, которая выделяет память и возвращает указатель на нулевое значение, make не только выделяет память, но и инициализирует внутреннюю структуру данных, возвращая сам объект, готовый к использованию. Первым аргументом функция принимает тип данных, вторым - размер или емкость в зависимости от типа.

Синтаксис

gomake(T, len, cap)

Где T - тип данных (срез, карта или канал), len - длина (для срезов и каналов), cap - емкость (только для срезов, необязательный параметр).

Создание среза

Функция make создает срез с указанной длиной и емкостью. Давайте создадим срез целых чисел длиной 3 и емкостью 5:

gopackage main

import "fmt"

func main() {
  slice := make([]int, 3, 5)
  fmt.Printf("len=%d cap=%d %v\n", len(slice), cap(slice), slice)
}

Результат выполнения кода:

go"len=3 cap=5 [0 0 0]"

Создание среза с элементами

При создании среза с помощью make элементы инициализируются нулевыми значениями. Давайте присвоим значения элементам среза:

gopackage main

import "fmt"

func main() {
  slice := make([]string, 3)
  slice[0] = "a"
  slice[1] = "b"
  slice[2] = "c"
  fmt.Println(slice)
}

Результат выполнения кода:

go[a b c]

Создание карты

Функция make создает инициализированную карту, готовую к добавлению пар ключ-значение. Вторым аргументом можно указать подсказку по размеру для оптимизации:

gopackage main

import "fmt"

func main() {
  m := make(map[string]int, 5)
  m["one"] = 1
  m["two"] = 2
  m["three"] = 3
  fmt.Println(m)
}

Результат выполнения кода:

go"map[one:1 three:3 two:2]"

Создание канала

Функция make создает буферизированный канал с указанной емкостью. Каналы используются для взаимодействия между горутинами:

gopackage main

import "fmt"

func main() {
  ch := make(chan int, 2)
  ch <- 10
  ch <- 20
  fmt.Println(<-ch)
  fmt.Println(<-ch)
}

Результат выполнения кода:

go10
20

Пример с разными типами

Давайте создадим все три типа данных с помощью make и выведем их значения:

gopackage main

import "fmt"

func main() {
  s := make([]int, 2, 4)
  m := make(map[string]bool)
  c := make(chan string, 1)

  s[0] = 1
  s[1] = 2
  m["ok"] = true
  c <- "hello"

  fmt.Println(s)
  fmt.Println(m)
  fmt.Println(<-c)
}

Результат выполнения кода:

go[1 2]
"map[ok:true]"
"hello"

Смотрите также

  • функцию new,
    которая выделяет память и возвращает указатель
  • тип slice,
    который представляет динамический массив
  • тип map,
    который представляет коллекцию пар ключ-значение
  • тип chan,
    который используется для взаимодействия между горутинами