Функция make
Функция make предназначена для создания и инициализации
срезов (slice), карт (map) и каналов (chan).
В отличие от new, которая выделяет память и возвращает указатель
на нулевое значение, make не только выделяет память, но и
инициализирует внутреннюю структуру данных, возвращая сам объект,
готовый к использованию. Первым аргументом функция принимает тип
данных, вторым - размер или емкость в зависимости от типа.
Синтаксис
make(T, len, cap)
Где T - тип данных (срез, карта или канал),
len - длина (для срезов и каналов),
cap - емкость (только для срезов, необязательный параметр).
Создание среза
Функция make создает срез с указанной длиной и емкостью.
Давайте создадим срез целых чисел длиной 3 и емкостью 5:
package main
import "fmt"
func main() {
slice := make([]int, 3, 5)
fmt.Printf("len=%d cap=%d %v\n", len(slice), cap(slice), slice)
}
Результат выполнения кода:
"len=3 cap=5 [0 0 0]"
Создание среза с элементами
При создании среза с помощью make элементы инициализируются
нулевыми значениями. Давайте присвоим значения элементам среза:
package main
import "fmt"
func main() {
slice := make([]string, 3)
slice[0] = "a"
slice[1] = "b"
slice[2] = "c"
fmt.Println(slice)
}
Результат выполнения кода:
[a b c]
Создание карты
Функция make создает инициализированную карту,
готовую к добавлению пар ключ-значение. Вторым аргументом
можно указать подсказку по размеру для оптимизации:
package main
import "fmt"
func main() {
m := make(map[string]int, 5)
m["one"] = 1
m["two"] = 2
m["three"] = 3
fmt.Println(m)
}
Результат выполнения кода:
"map[one:1 three:3 two:2]"
Создание канала
Функция make создает буферизированный канал
с указанной емкостью. Каналы используются для
взаимодействия между горутинами:
package main
import "fmt"
func main() {
ch := make(chan int, 2)
ch <- 10
ch <- 20
fmt.Println(<-ch)
fmt.Println(<-ch)
}
Результат выполнения кода:
10
20
Пример с разными типами
Давайте создадим все три типа данных с помощью make
и выведем их значения:
package 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)
}
Результат выполнения кода:
[1 2]
"map[ok:true]"
"hello"