Day2 理解 golang slice 用法及原理 II

续上篇 Day1 理解 golang slice 用法及原理 I

什麽是 slice 是的容量 (capbility,也就是上篇所提的 cap),跟长度有什麽关系 (length)?
打个比方,有一瓶矿泉水,矿泉水最多能容纳 600cc,但是实际上只装有 300cc 的水。大概就是这种感觉。

创建 slice 语法 III

s := make([]int, 3, 5)

make 创建了个型态为 int 长度为 5 的 underlying array,并且用一个名为 s 的 slice 描述了从第零个元素到第三个元素的片段。

最後一个创建方式

s := make([]int, 3)

其实就创建一个长度为 3 的 underlying array,并且使用 s 描述这一整段 array,有就是说 len(s) 等於 cap(s)。

这麽说 slice 是能伸缩的?

众所皆知 array 是不能伸缩的,underlying array 也是 array,所以 array 不能伸缩。但是 slice 可以透过 slice header 的长度的更改就轻易达到了伸缩的效果。

slice 最常看见的语法就是用分号取一小个片段,所以 slice 能缩小是确定的。
但是 slice 能伸长吗?答案是可以的。

s := make([]int, 3, 5)
s = s[:len(s) + 1]

没错,你没看错,这段程序是不会 panic 的。还记得矿泉水的例子吗,水没装满当然能继续装啊,只要不装超过容量就行。同理,这段程序,s 只要伸张不超过容量就不会 panic。

但是这段程序是为了观念所写,除非有什麽特定场景,不然没事千万别这样干。如果觉得 slice 长度不够,大多数情况下用 append 函式解决,後面几张也会提到 append 是怎麽做的。

文章索引


<<:  D0 前言

>>:  D1 第零周:心态培养

版控图

本篇文章只是要探索一下 git 工作流程,这篇文章只会使用 git 有关的内容,因为我对其他版控生态...

【PHP Telegram Bot】Day09 - 用 PHP 主动接收和发送讯息吧!

前置作业 复制程序码 还记得前天最後建立的资料夹吗,把它用 VS code 打开,再建立一个 php...

【从零开始的 C 语言笔记】第七篇-格式指定字 & 特殊字元

不怎麽重要的前言 上一篇我们介绍了什麽是变数,也结合了资料型态来让大家了解,接下来大家有没有想过,如...

网络资讯撷取神器 – 爬虫程序 (PYTHON SELENIUM)

我们在举办【Python 大数据培训课程】时,发现很多学员对 Selenium 有以下问题,在此解释...