为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的函数返回一个新切片还是指向第一个切片的底层数组的切片?

Go 中的函数返回一个新切片还是指向第一个切片的底层数组的切片?

Go
哆啦的时光机 2023-07-10 16:36:54
如果可能的话,我正在尝试使我的代码更具性能,节省内存我做了一些研究,但找不到关于这个具体案例的任何信息。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,包含支持数组以及长度和容量。它包含一个指向实际存储元素的数组的指针。切片值不包含元素(与数组不同)。


因此,当传递或返回切片时,将从该标头传递或返回一个副本以及指针。该指针指向同一个支持的数组。因此,如果您修改切片的元素,它也会修改支持的数组,因此所有切片(共享相同的支持数组)也会得到更改。


因此,当您将切片传递给函数时,将从该标头创建一个副本,包括指针,该指针将指向相同的后备数组。修改切片的元素意味着修改后备数组的元素,因此共享相同后备数组的所有切片都将“观察”更改。


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信