七叶笔记 » golang编程 » golang切片使用注意事项

golang切片使用注意事项

golang中使用切片,底层数组不会被复制,仍然会被切片所引用

 package main
import (
"fmt"
"io/ioutil"
)
func main() {
filename := "/path/to/data.txt"
data, err := ioutil.ReadFile(filename)
if nil != err {
fmt.Println(err.Error())
}
ds := data[:64]
fmt.Println(ds)
}  

在上面的代码中,ds保存了data的前64个字节,ds是data进行切片得到的,如果ds要使用,那么data会继续在内存中,不会被GC回收,如果data数据量特别大,对内存造成的压力就比较大。

解决的方法是将结果克隆一份,这样可以释放底层的数组

 package main
import (
"fmt"
"io/ioutil"
)
func main() {
filename := "/path/to/data.txt"
data, err := ioutil.ReadFile(filename)
if nil != err {
fmt.Println(err.Error())
}
ds := append([]byte{}, data[:64]...)
fmt.Println(ds)
}  

相关文章