golang中数组、切片以及映射(map)的特点
2020-04-28 本文已影响0人
韩小禹
数组
- 数组和切片的创建方式不同
# 创建数组
array := [3]int{1,2,3}
# 创建切片
slice := []int{1,2,3}
- 数组是值传递,除非声明为指针传递
# 这样的传值会非常消耗内存空间
# 声明一个包含100万个int类型的元素,需要8MB内存
# 每次调用函数,传入数组时会先在栈上分配8MB内存,然后再将数据赋值到刚刚分配的内存中
var arr [1e6]int
foo (arr)
func foo(array [1e6]int){
...
}
- 数组是切片和映射的基石
切片
- 切片是围绕动态数组的概念构建的,可以按需自动增长或缩小。
- 在64位架构的机器上,一个切片需要24个字节的内存,指针字段需要8个字节,切片长度和切片容量分别需要8个字节。由于与切片关联的数据包含在底层数组里,不属于切片本身,所以将切片
复制到任意函数的时候,对底层数组大小都不会有影响。复制时只会复制切片本身,不会涉及底
层数组,所以在函数间传递切片的成本也很低。 - 将切片或者映射传递给函数成本很小,并且不会复制底层的数据结构。
映射
- 映射是一个存储键值对的无序集合。
- 映射用于存储一系列无序的键值对,映射是无序的,无序的原因是映射的实现使用了散列表。
- 映射也是引用传值,当把映射传递给一个函数,并对该映射做出修改后,其他所有对这个映射的引用都会觉察到。
- 将切片或者映射传递给函数成本很小,并且不会复制底层的数据结构。