切片是对底层数组的引用。只要切片存在,就不能释放数组的内存,即不能对此数组进行垃圾收集。某些情况下,这会导致内存浪费。
例如,假设有一个非常大的数组,但我们只使用其中的一小部分。我们通过创建切片来访问该数组,这里由于切片引用了数组,虽然只使用了数组的一小部分数据,但整个数组内存不能被释放。
解决这个问题的方法是使用复制函数func copy(dst, src []T) int
来复制那个切片,我们可以使用新的切片,原来的数组就可以被垃圾收集。
package main
import (
"fmt"
)
func countries() []string {
countries := []string{"China", "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)
}
复制切片countriesCpy
后,数组countries
就可以被释放了。