Go中的切片类型有什么意义?

时间:2010-01-20 03:35:49

标签: go slice

我已阅读this但仍未充分了解slicearray的优势。所以我期待有人在SO中解释得比它好,我相信你可以: )

4 个答案:

答案 0 :(得分:19)

切片在数组上有很多用途,其中一些海报已经提到过。

  • 切片可以像指针一样以多种方式操作。
    • 多个切片可以“指向”相同的基本数组
    • 切片通过引用传递,但由于切片本身是指针,因此可以更有效地传递“数组”,因为整个数组不需要复制。
  • 但是,与指针不同,切片提供额外的缓冲安全性
    • 切片下溢和溢出会触发异常,而不是让您不安全地访问其他内存区域。
    • 切片允许您限制仅访问阵列的某些区域。这在处理子集时非常有用。
  • 切片的长度是在运行时动态确定的,与在编译时固定其大小的数组不同。此外,切片可以在运行时动态调整大小。

答案 1 :(得分:13)

go中,数组按值传递;因此,要“通过引用传递”,您使用切片。这还不是全部!引用Go tutorial

  

数组的大小是其中的一部分   类型;但是,可以声明一个切片   变量,可以指定一个变量   指向任何具有相同数组的指针   元素类型或更常见的 - a   形式的切片表达式[低:   高],代表子阵   索引由低到高-1。片   看起来很像阵列但没有   显式大小([]与[10])和它们   引用底层的一部分,   通常是匿名的,常规的数组。   多个切片可以共享数据   表示相同阵列的片段;   多个数组永远不能共享数据。

     

切片在Go中更为常见   程序比常规数组;他们是   更灵活,有参考   语义,并且是有效的。什么   他们缺乏的是对...的精确控制   常规数组的存储布局;如果   你想拥有一百个元素   存储在结构中的数组,   你应该使用常规数组。

     

将数组传递给函数时,   你几乎总想宣布   形式参数是一个切片。什么时候   你打电话给这个功能吧   数组的地址和Go将   创建(有效)切片参考   通过那个。

答案 2 :(得分:2)

我认为切片和数组在Go Blog上的this post中描述得更好更详细。

答案 3 :(得分:0)

除了已经给出的答案之外,切片可以动态调整大小,而数组则不能。也就是说,您只能使用常量来指定数组的大小,而您可以使用变量来指定切片的大小。