我已经阅读了这篇文章,但仍然没有完全意识到slice
反对的优势array
。所以我期待有人在 SO 中解释得比它更好,我相信你可以:)
问问题
4698 次
4 回答
21
切片比数组有很多用途,其中一些其他海报已经提到过。
- 切片可以像指针一样以多种方式操作。
- 多个切片可以“指向”同一个基本数组
- 切片是通过引用传递的,但是由于切片本身是一个指针,它可以用来更有效地传递“数组”,因为不需要复制整个数组。
- 但是,与指针不同,切片提供了额外的缓冲区安全性
- 切片下溢和溢出会触发异常,而不是允许您以不安全的方式访问其他内存区域。
- 切片允许您限制仅访问数组的某些区域。这在处理子集时非常有用。
- 切片的长度是在运行时动态确定的,这与在编译时固定大小的数组不同。此外,切片可以在运行时动态调整大小。
于 2010-01-24T05:48:09.080 回答
14
在go
中,数组是按值传递的;因此,要“通过引用传递”,您使用切片。这还不是全部!引用 Go 的教程:
数组的大小是其类型的一部分;但是,可以声明一个切片变量,可以将指针分配给具有相同元素类型的任何数组,或者更常见的形式为 a[low : high] 的切片表达式,表示由 low 到索引的子数组高-1。切片看起来很像数组,但没有明确的大小([] vs. [10]),它们引用底层的、通常是匿名的、常规数组的一段。如果多个切片表示同一数组的片段,则可以共享数据;多个数组永远不能共享数据。
在 Go 程序中,切片比常规数组更常见;它们更灵活,具有引用语义并且效率更高。他们缺乏的是对规则数组的存储布局的精确控制;如果你想在你的结构中存储一个数组的一百个元素,你应该使用一个常规数组。
将数组传递给函数时,您几乎总是希望将形参声明为切片。当您调用该函数时,获取数组的地址,Go 将(有效地)创建一个切片引用并传递它。
于 2010-01-20T03:51:55.307 回答
2
我认为在 Go 博客上的这篇文章中对切片和数组的描述要好得多,也更详细。
于 2011-06-02T01:03:36.907 回答
0
除了已经给出的答案之外,切片可以动态调整大小,而数组则不能。也就是说,只能使用常量来指定数组的大小,而可以使用变量来指定切片的大小。
于 2010-01-20T18:32:52.073 回答