Golang Arrays和Slices的区别
嘻嘻发布于2020-11-25
最后更新于2020年11月25日
浏览这篇文章将简要描述Go中数组和片之间的区别。
数组是相同类型的固定长度item序列。Go中的数组可以使用以下语法创建:
[N]Type
[N]Type{value1, value2, ..., valueN}
[...]Type{value1, value2, ..., valueN}
与C/C++(数组的作用类似于指针)和Java(数组是对象引用)不同,Go中的数组是值。这有几个重要的含义:
(1)将一个数组赋值给另一个数组会复制所有的元素,
(2)如果你将一个数组传递给一个函数,它会收到一个数组的副本(不是指向它的指针或引用)。
正是因为数字是值传递,所以在处理大量元素的数组,代价很大。
另一方面,切片要比数组灵活、强大和方便得多。与数组不同,切片可以使用内置的append函数调整大小。此外,切片是引用类型,这意味着分配它们的成本很低,并且可以将它们传递给其他函数,而无需创建其底层数组的新副本。最后,Go标准库中的函数在它们的公共api中都使用切片而不是数组。
可以使用以下语法创建切片:
make([]Type, length, capacity)
make([]Type, length)
[]Type{}
[]Type{value1, value2, ..., valueN}
总的来说,切片数组相比,片更清晰、更灵活、更不容易出现bug,所以在可能的情况下,您应该更喜欢使用切片而不是数组。