如果可能的话,我正在尝试使我的代码更具性能,节省内存我做了一些研究,但找不到关于这个具体案例的任何信息。func createSlice() []int { return s[]int{1,2,3}}func main() { s2 := createSlice()}s2 是一个拥有自己底层数组的全新切片,还是指向 s 底层数组的切片?
1 回答
慕田峪9158850
TA贡献1794条经验 获得超7个赞
你必须了解 Go Slices 的 header。那么,你自己就能得到答案。
通过检查reflect.SliceHeader
类型来查看切片标头中的内容:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
实际上,切片值是一个header,包含支持数组以及长度和容量。它包含一个指向实际存储元素的数组的指针。切片值不包含元素(与数组不同)。
因此,当传递或返回切片时,将从该标头传递或返回一个副本以及指针。该指针指向同一个支持的数组。因此,如果您修改切片的元素,它也会修改支持的数组,因此所有切片(共享相同的支持数组)也会得到更改。
因此,当您将切片传递给函数时,将从该标头创建一个副本,包括指针,该指针将指向相同的后备数组。修改切片的元素意味着修改后备数组的元素,因此共享相同后备数组的所有切片都将“观察”更改。
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报
0/150
提交
取消