在 Go 语言中,make
是一个内置函数,专门用于分配和初始化 slice(切片)、map(映射) 和 channel(通道) 三种数据类型。
**make
函数不会返回一个指针,而是返回初始化后的数据结构本身的引用**。
make
函数的用途
make
的主要作用是为这些引用类型的数据结构分配内存并进行初始化,而不是像 new
函数那样仅仅分配内存。
make
返回的引用类型可以直接使用,无需进一步初始化。
make
函数的语法
make
函数的基本调用格式如下:
make(type, length, capacity)
- type:要创建的类型,可以是
slice
、map
或channel
。 - length(可选):数据结构的初始长度,适用于
slice
和channel
。 - capacity(可选):数据结构的容量,适用于
slice
,如果不指定,容量默认等于长度。
make
函数的返回值
make
函数返回的是指定类型的值:
- slice:返回一个指定长度和容量的切片。
- map:返回一个初始化后的映射。
- channel:返回一个带有指定容量的通道(若不指定容量则为无缓冲通道)。
每种类型的 make
返回值都是对应类型的引用,因此可以直接使用。
示例
1. 使用 make
创建切片
s := make([]int, 5, 10) // 创建一个长度为 5,容量为 10 的切片
fmt.Println(len(s), cap(s)) // 输出:5 10
make([]int, 5, 10)
创建了一个长度为 5,容量为 10 的切片。- 返回值
s
是一个初始化后的切片,带有 5 个默认值为 0 的int
元素。
2. 使用 make
创建映射
m := make(map[string]int) // 创建一个空的 map
m["key"] = 42
fmt.Println(m["key"]) // 输出:42
make(map[string]int)
创建了一个空的map
,可以直接插入键值对。- 返回值
m
是一个空的映射,可以直接用来存储键值对。
3. 使用 make
创建通道
ch := make(chan int, 2) // 创建一个容量为 2 的缓冲通道
ch <- 1
ch <- 2
fmt.Println(<-ch) // 输出:1
fmt.Println(<-ch) // 输出:2
make(chan int, 2)
创建了一个容量为 2 的缓冲通道,可以存放两个int
值。- 返回值
ch
是一个通道,允许在 Goroutine 间进行数据通信。
总结
make
函数用于分配和初始化三种引用类型:slice
、map
和channel
。make
函数返回一个初始化后的值,而不是指针,可以直接使用