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

pie*_*fou 24 go slice

我已经读过这个,但仍然没有充分意识到slice反对的优势.array所以我期待有人在SO解释比它更好,我相信你可以:)

Rus*_*ist 19

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

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

  • 切片不是通过引用传递的,而是被复制的。切片本身不是指针,它们不传递数组。切片值作为 Go 中的所有内容通过副本传递。只是,传递的切片值“包含”一个指向后备数组的指针(切片值本身不是指针)。 (2认同)

Ale*_*lli 13

go,数组按值传递; 因此,要"通过引用传递",您使用切片.这还不是全部!引用Go的教程:

数组的大小是其类型的一部分; 然而,人们可以声明一个切片变量,向其中一个可以一个指针分配给任何阵列相同的元素类型或-更共同的切片的形式表达的[低:高],表示通过低索引的子阵列高1.切片看起来很像数组,但没有明确的大小([]与[10]),它们引用了一个底层的,通常是匿名的常规数组.如果多个切片表示相同阵列的片段,则它们可以共享数据; 多个阵列永远不能共享数据.

切片在Go程序中比常规数组更常见; 它们更灵活,具有引用语义,并且是高效的.他们缺少的是对常规阵列的存储布局的精确控制; 如果要在结构中存储数百个数组元素,则应使用常规数组.

将数组传递给函数时,您几乎总是希望将形式参数声明为切片.当你调用函数时,获取数组的地址,Go将创建(有效)切片引用并传递它.