这系列叫做後端菜鸡学习杂记,所以我也没打算特定写什麽,在熟悉了 go 语法之後,常常只使用其语法,不得其原理,常常写出来的程序自己无法分析好不好,所以就从探讨 go 语言开个起手式,回头打好基础。未来可能会谈一些後端常用到的技术,比如说 JWT token、 grpc、micro service 等等。
在刚接触 go 语言时一直觉得 slice 一直很陌生,这次我把 Reference 里的文章给读一读,一探究竟。
其实概念非常简单。
slice 是一种资料结构,用来描述一段连续的阵列
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
但其实在 go 语言里,并不常看到上面两个例子,更常看到的语法像是这样,其实效果和第一个例子几乎一样
s := []int{0, 1, 2, 3}
在这行程序里,其实 go 已经建立好一个潜在的阵列 (官方使用 underlying array 这个词),并且用 slice header 来描述它。我们不需要像上个例子一样事先宣告阵列再用 slice 描述它,省了一到手续,方便了许多。
下篇将会谈到创建 slice 语法 III (使用 make 语法),以及 cap 是什麽。
前言 今天文章的标题完完全全打脸了笔者在 Day27 的结语,没想到在最後一天仍然还是介绍了早午餐给...
乳提 昨天试过了在虚拟机上运行预设的 hello world 程序。 在虚拟机上很方便很快速,但其实...
现在我们来学习函式的进阶,全域变数跟区域变数的差别和使用方法。区域变数的差别和使用方法。 ...
引言 今天我们接续昨天的 web 渗透主题,继续解该系列第二题吧。 昨天简短介绍了一些 HTTP ...
应该是延续 php 的漏洞问题... 18. Cereal hacker2 Points: 500 ...