首先,我是一个彻底的Golang门外汉。刚开始学习Golang,对它的一些设计挺反感的,遂发文抱怨,反正抱怨又不用花钱 :-p。
Golang中切片存在的意义,在我看来有几点:
1. 增加灵活性,数组高效但是死板,所以很多语言都有一种「动态数组」的数据结构。Java有ArrayList,Python有list,Scheme有vector。
Golang的切片中有两个概念:「长度」和「容量」。这两者的区分不应该暴露给程序员。
2. Golang中所有的变量都是以值的方式传递,当给一个函数传一个数组的时候,实际上传递的是它的一份拷贝。由于切片的尺寸小,在函数间复制和传递的成本低。
传递引用是一个很好的设计,它可以降低程序员写代码时的心智负担。Golang传递值的设计是它的弱点,切片的部分价值其实是在给Golang的设计缺陷缝补丁。
切片里面还有个叫「nil切片」的特殊东西,它和包含0个元素的空切片还不是一回事儿。Goalng的书里面有写到「在Go语言里,nil切片是很正常的创建切片的方法。nil切片可以用于很多标准库和内置函数。在需要描述一个不存在的切片时,nil切片会很好用。例如,函数要求返回一个切片但是发生异常的时候。」
Sum type和Union type都可以简单优雅地解决这个问题,Golang作为一门出生很晚的语言,死活不虚心学习前人的经验,坚持做最丑陋的选择,实在令人佩服。
好了,前面已经说了本文纯属抱怨。抱怨结束。