Go:数组与切片的区别

栏目: IT技术 · 发布时间: 4年前

内容简介:假设如下代码:大多数人按照“直观”的理解可能会觉得执行需要特别说明的是,在 Go 语言中有两种看起来很像的数据类型:

假设如下代码:

func f() {
       x, y := make([]byte, 9000), make([]byte, 9)
       a := x
       b := y
       // ...
 }

大多数人按照“直观”的理解可能会觉得执行 a := x 会比 b := y 代价更高,因为切片 xy 大得多。其实 xy 的数据类型都是   []byte ,在 Go 内部每个切片实际存储的数据是三个 uintptr 的长度,所以对 ab 的赋值需要的代价是一样的,与切片数据的实际长度无关。

需要特别说明的是,在 Go 语言中有两种看起来很像的数据类型: 数组 (array)和 切片 (slice)。

数组

数组的长度是固定的,比如 [4]int{} 表示一个长度为 4 的 int 数组,其在内存中的数据结构是这样的:

Go:数组与切片的区别
数据的数据结构(来源:The Go Blog)

当将数组赋值给一个变量,实际上会将数组的整块内存区域都复制一份。

切片

切片的长度是不固定的,可以随使用需要动态增长,通过 []int{} 表示一个 int 切片,其在内存中的数据结构是这样的:

Go:数组与切片的区别
切片的数据结构 (来源: The Go Blog

第一部分是切片对应的数组指针(ptr),第二部分是切片的长度(len),第三部分是切片的容量(cap)(即所指向的数组的实际长度)。当将切片复制给一个变量,实际上是将切片的 ptr、len、cap 这三项数据复制一份,而数据指向的数组还是原来那个。所以此时修改了切片某个索引位置的数据时,会影响到所有相同 ptr 的切片。

参考链接

  • Are large slices more expensive than smaller ones? [1] , Dave Cheney

  • Go Slices: usage and internals [2] , The Go Blog

参考资料

[1]

Are large slices more expensive than smaller ones?: https://dave.cheney.net/2020/03/01/are-large-slices-more-expensive-than-smaller-ones

[2]

Go Slices: usage and internals: https://blog.golang.org/go-slices-usage-and-internals


以上所述就是小编给大家介绍的《Go:数组与切片的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法霸权

算法霸权

[美] 凯西·奥尼尔 / 马青玲 / 中信出版集团 / 2018-9-1 / 69.00元

数据科学家凯西•奥尼尔认为,我们应该警惕不断渗透和深入我们生活的数学模型——它们的存在,很有可能威胁到我们的社会结构。 我们生活在一个依赖“算法”的时代,它对我们生活的影响越来越大,我们去哪里上学,我是不是应该贷款买车,我们应该花多少钱来买健康保险,这些都不是由人来决定的,而是由大数据模型来决定的。从理论上来说,这一模型应该让社会更加公平,每一个人的衡量标准都是一样的,偏见是不存在的。 ......一起来看看 《算法霸权》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具