golang slice len cap

发布时间:2024-07-07 18:09:31

golang slice len cap

Golang中的切片(slice)是一种动态数组,它是对数组的封装,可以在不改变其容量的情况下,随意地增减元素。在Golang中,切片拥有着比数组更好的灵活性和易用性,因此被广泛应用于各种场景。

在使用切片时,我们经常会用到两个重要的函数,即len()和cap()。这两个函数分别用于获取切片的长度和容量。下面我们将分别介绍这两个函数的用法和具体作用。

len()函数

len()函数用于获取切片的长度,也就是切片中实际存储的元素个数。例如:

numbers := []int{1, 2, 3, 4, 5}
fmt.Println(len(numbers)) // 输出结果为:5

在上述代码中,我们定义了一个切片numbers,并使用len()函数获取了其长度,并将结果打印出来。切片numbers中有5个元素,所以输出结果为5。

需要注意的是,len()函数对切片的操作并不会影响到切片本身。它只是返回了切片中实际存储的元素个数,不会改变切片的内容。

cap()函数

cap()函数用于获取切片的容量,也就是切片底层数组的大小。例如:

numbers := []int{1, 2, 3, 4, 5}
fmt.Println(cap(numbers)) // 输出结果为:5

在上述代码中,我们定义了一个切片numbers,并使用cap()函数获取了其容量,并将结果打印出来。切片numbers底层数组的大小为5,所以输出结果为5。

需要注意的是,cap()函数对切片的操作同样不会影响到切片本身。它只是返回了切片底层数组的大小,不会改变切片的内容。

len()和cap()的关系

切片的长度和容量之间存在着一定的关系,在某些情况下可以彼此转换。具体来说:

下面我们通过几个例子来具体说明:

// 例子1
numbers := make([]int, 2, 5)
fmt.Println(len(numbers)) // 输出结果为:2
fmt.Println(cap(numbers)) // 输出结果为:5

// 例子2
numbers := make([]int, 5)
fmt.Println(len(numbers)) // 输出结果为:5
fmt.Println(cap(numbers)) // 输出结果为:5

// 例子3
numbers := []int{1, 2, 3, 4, 5}
fmt.Println(len(numbers)) // 输出结果为:5
fmt.Println(cap(numbers)) // 输出结果为:5

// 例子4
numbers := []int{1, 2}
fmt.Println(len(numbers)) // 输出结果为:2
fmt.Println(cap(numbers)) // 输出结果为:2

// 例子5
numbers := []int{1, 2, 3, 4, 5}
numbers = append(numbers, 6)
fmt.Println(len(numbers)) // 输出结果为:6
fmt.Println(cap(numbers)) // 输出结果为:10

在上述例子中,我们分别创建了不同长度和容量的切片,并使用len()和cap()函数获取了它们的长度和容量,并将结果打印出来。通过对比输出结果可以看出切片的长度和容量的变化。

需要特别注意的是,在例子5中,当我们向切片numbers追加元素6时,由于切片的长度等于其容量,追加元素会导致底层数组重新分配,切片的容量会扩大到原来的两倍(从5变为10),并将原有元素复制到新的底层数组中。

总结

本文介绍了Golang中切片的len()和cap()函数的用法以及它们的具体作用。len()函数用于获取切片的长度,也就是切片中实际存储的元素个数;cap()函数用于获取切片的容量,也就是切片底层数组的大小。

切片的长度和容量之间存在一定的关系,同时也可以相互转换。切片的长度不能超过其容量,当长度等于容量时,追加元素会导致切片重新分配底层数组;当长度小于容量时,追加元素不会导致切片重新分配底层数组。

相关推荐