golang类型
chan
通道类型常用于协成之间的通信,底层采用一个环形队列的方式实现了一个缓冲区,数据传输过来,如果等待队列里没有读的gorutine, 会将数据暂存到缓存去,如果队列满了,需要写入的协成会放到待写入队列阻塞,如果有读的协成进来会先从缓冲区读取一个数据,缓存区由两个游标控制,一个游标记录环形队列下一次要读取的位置,另一个游标记录环形队列下一次要存放的位置。 环形队列使用切片数组实现。通过游标位置与容量的取模,计算下一个游标位置。
select用于读取或写入channel,如果没有default case,select读取数据没有读取到,会阻塞,有default case,则不会阻塞,如果是读取数据,要判断是否读取成功,关闭的通道也可以读取,select每次获取通道数据时,会将case切片打乱进行读取,防止有的case被饿死。
切片
切片类型是基于数组的,但是比数组灵活,可以动态扩容,切片在扩容之前,与数组共用一块内存空间,所以修改切片内元素,也会变更数组的元素,如果切片发生扩容,则会从新开辟一块内存空间,然后将原切片的内容拷贝过去,新写入的元素会写到新的切片后面,这时修改切片内容,不会影响原数组。切片可以使用数组创建,也可以使用make创建。通过数组创建切片,切片的容量是start到数组结尾。使用copy复制切片不会发生扩容。