扫码一下
查看教程更方便
在 go 语言将切片作为参数传递给函数 一章中,我们介绍了其实切片是一个对数组的结构体的表示。在go语言中,其底层表示如下所示
type slice struct {
length int
capacity int
zerothelement *byte
}
切片保存对底层数组的引用。但是这里就会有一个问题,只要切片在内存中,数组就不能被垃圾回收。
当涉及到内存管理时,这可能会引起关注。假设我们有一个非常大的数组,但是我们只是需要处理其中的一小部分。然后,我们从该数组创建一个切片并开始处理这个切片。这里要注意的重要一点是数组仍然在内存中,因为切片引用了它。
我们可以看到,底层的数组有 n 个元素。但是我们只需要其中的四个元素来处理。如果创建的切片一直在内存中,那这个具有n个元素的数组也一直在内存中不会被释放。
解决此问题的一种方法是使用复制功能,语法如下
func copy(dst, src []t) int
使用 copy() 函数来生成切片的副本。这样我们就可以使用新的切片,并且可以对原始数组进行垃圾回收。
下面我们看一个示例
package main
import (
"fmt"
)
func countries() []string {
countries := []string{"usa", "singapore", "germany", "india", "australia"}
neededcountries := countries[:len(countries)-2]
countriescpy := make([]string, len(neededcountries))
copy(countriescpy, neededcountries) //将neededcountries 拷贝到 countriescpy
return countriescpy
}
func main() {
countriesneeded := countries()
fmt.println(countriesneeded)
}
上述代码执行结果如下
[usa singapore germany]
上面程序的 neededcountries := countries[:len(countries)-2]
创建了一个切片,该切片除了countries的最后 2 个元素。然后创建了一个新的切片 countriescpy。接下来将neededcountries拷贝到countriescpy并从函数返回countriescpy。现在countries 数组可以被当作垃圾回收,因为neededcountries不再被引用。