奇特的Go 语言数组和切片

现代编程语言都有动态数组,数组一般来说都是连续分配内存,但是要支持动态扩缩是比较麻烦的。比较底层的语言就把这些任务都留给了开发者。比如C语言,可以用指针操作数组。如果数组设置小了,就经常需要在内存里搬运数据,对性能造成浪费,设置大了,对于内存的使用是一个浪费,也没有越界检查,付出了很多代价。目的主要是保持对系统的掌控,现代计算机发展迅速,增加了许多新的编程领域,比如移动App,网页,服务器网页等,大多数场合不需要特别关注硬件和底层操作系统,已经不必要再使用古老的系统语言。

现代语言呢,需要对开发者友好,所以通常都有些实现方法,这些实现方法各有千秋。Go语言就走了一条奇特的路线。

在Go 语言中,有数组和切片两个概念,如果定义的时候方括号[]里有东西,那么,这个变量就是一个数组,如果是空的,就是切片。切片必然要指向一个下层数组(Underlying),下层数组可以不定义,隐含。

无论是数组,还是切片都是连续的物理内存分配。数组就当是地址的常量,不能动态扩展大小,切片就是地址的变量,可以分配新的地址。同样的添加元素的操作,如果需要分配新的内存,就和不新分配内存的切片行为不一致。下文给了一个有趣的例子:

https://medium.com/@riteeksrivastava/how-slices-internally-work-in-golang-a47fcb5d42ce

评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注