Day1 理解 golang slice 用法及原理 I

我写什麽

这系列叫做後端菜鸡学习杂记,所以我也没打算特定写什麽,在熟悉了 go 语法之後,常常只使用其语法,不得其原理,常常写出来的程序自己无法分析好不好,所以就从探讨 go 语言开个起手式,回头打好基础。未来可能会谈一些後端常用到的技术,比如说 JWT token、 grpc、micro service 等等。


在刚接触 go 语言时一直觉得 slice 一直很陌生,这次我把 Reference 里的文章给读一读,一探究竟。

其实概念非常简单。

slice 是一种资料结构,用来描述一段连续的阵列

创建 slice 语法 I

arr := [...]int{0, 1, 2, 3} // arr is array
s := arr[:]  // s is slice

很常看到第二行这种语法,令人搞混,到底 s 是什麽,看以下图

slice 是一种资料结构,用来描述一段连续的阵列 ,此资料结构指的就是图上的 slice header。
slice header 使用指标储存某个阵列元素的地址,两个数字分别储存 slice 的长度和 cap (cap 之後再提)。这张图表示,s 这个 slice 描述了 arr 这一整段的阵列。

在概念上 slice header 的结构会像以下

type sliceHeader struct {
    ptr *int
    len int
    cap int
}

当然 slice 也可以描述一小段阵列,以下为描述 [2, 3] 的 slice

arr := [...]int{0, 1, 2, 3} // arr is array
s := arr[2:]  // s is slice

创建 slice 语法 II

但其实在 go 语言里,并不常看到上面两个例子,更常看到的语法像是这样,其实效果和第一个例子几乎一样

s := []int{0, 1, 2, 3}

在这行程序里,其实 go 已经建立好一个潜在的阵列 (官方使用 underlying array 这个词),并且用 slice header 来描述它。我们不需要像上个例子一样事先宣告阵列再用 slice 描述它,省了一到手续,方便了许多。

下篇将会谈到创建 slice 语法 III (使用 make 语法),以及 cap 是什麽。

Reference

文章索引


<<:  1.移转 Aras PLM大小事-换了Agile?

>>:  行销分析

[Day 30] 永和美食纪录-向日葵早午餐 国中店

前言 今天文章的标题完完全全打脸了笔者在 Day27 的结语,没想到在最後一天仍然还是介绍了早午餐给...

DAY16 Run application in real life

乳提 昨天试过了在虚拟机上运行预设的 hello world 程序。 在虚拟机上很方便很快速,但其实...

javascript函式的变形2

现在我们来学习函式的进阶,全域变数跟区域变数的差别和使用方法。区域变数的差别和使用方法。 ...

[2021铁人赛 Day26] Web Exploitation Web渗透题目 02

引言 今天我们接续昨天的 web 渗透主题,继续解该系列第二题吧。 昨天简短介绍了一些 HTTP ...

[网页漏洞] - 资料库漏洞 - 老调重弹

应该是延续 php 的漏洞问题... 18. Cereal hacker2 Points: 500 ...