
使用 make 函数创建切片
make 函数是 Go 语言中用于创建切片、映射和通道的内置函数。对于切片,make 函数会分配一个底层数组,并返回一个引用该数组的切片值。make 函数的常见用法如下:
slice := make([]T, length, capacity)
- T:切片中元素的类型。
- length:切片的初始长度。
- capacity:切片的容量,即底层数组的大小。如果省略 capacity,则默认 capacity 等于 length。
示例代码
以下示例代码演示了如何使用 make 函数创建一个动态大小的切片:
package main
import "fmt"
func main() {
// 声明一个整数类型的切片,长度为 10,容量也为 10
slice := make([]int, 10)
// 初始化切片元素
for i := 0; i < len(slice); i++ {
slice[i] = i * 2
}
// 打印切片元素
fmt.Println("Slice:", slice)
// 使用 append 函数向切片追加元素
slice = append(slice, 20, 22, 24)
// 打印追加元素后的切片
fmt.Println("Slice after append:", slice)
// 打印切片的长度和容量
fmt.Println("Length of slice:", len(slice))
fmt.Println("Capacity of slice:", cap(slice))
// 声明一个容量为10的切片,长度为0
slice2 := make([]int, 0, 10)
fmt.Println("Length of slice2:", len(slice2))
fmt.Println("Capacity of slice2:", cap(slice2))
// 向 slice2 追加元素,直到超出容量
for i := 0; i < 15; i++ {
slice2 = append(slice2, i)
}
fmt.Println("Slice2 after append:", slice2)
fmt.Println("Length of slice2:", len(slice2))
fmt.Println("Capacity of slice2:", cap(slice2))
}代码解释:
立即学习“go语言免费学习笔记(深入)”;
- slice := make([]int, 10) 创建一个长度为 10,容量也为 10 的整数切片。这意味着底层数组的大小为 10,切片可以存储 10 个整数。
- for i := 0; i
- slice = append(slice, 20, 22, 24) 使用 append 函数向切片追加元素。append 函数会返回一个新的切片,其中包含追加的元素。如果切片的容量不足以容纳新元素,append 函数会自动分配一个更大的底层数组,并将现有元素复制到新数组中。
- len(slice) 返回切片的长度,即切片中元素的个数。
- cap(slice) 返回切片的容量,即底层数组的大小。
- slice2 := make([]int, 0, 10) 创建一个长度为0,容量为10的切片。
- 当向slice2追加元素超过容量时,容量会自动扩容。
注意事项
- 切片的长度可以动态改变,但容量是固定的。当切片的长度超过容量时,Go 运行时会自动分配一个新的底层数组,并将现有元素复制到新数组中。这个过程可能会导致性能损失,因此在创建切片时,应尽量预估切片的容量,以避免频繁的内存分配。
- 切片是引用类型,这意味着多个切片可以引用同一个底层数组。修改一个切片中的元素会影响其他引用同一个底层数组的切片。
- 可以使用 copy 函数将一个切片中的元素复制到另一个切片中。
总结
使用 make 函数可以方便地创建动态大小的切片。切片是 Go 语言中处理动态数组的强大工具,它提供了灵活的操作方式和自动内存管理功能。理解切片的长度、容量和引用语义对于编写高效的 Go 程序至关重要。通过合理地使用 make 函数和 append 函数,可以有效地管理切片的内存,并避免不必要的性能损失。










