关于Golang面试宝典
最近几年,Go的热度持续飙升,国内外很多大公司都在大规模的使用Go。Google是Go语言诞生的地方,其他公司如Facebook、腾讯、阿里、字节跳动、百度、京东、小米等都在拥抱和转向Go。Go语言的开源项目也非常多,如kubernetes、docker、etcd。
随着市场对Go语言人才需求的增长,很多开发者都投入了Go语言的怀抱。本系列文章将以第一视角与大家一同开始Golang的面试之路,希望大家能够有所收获,拿下心仪的offer。
Go语言切片知识点总结
什么是切片
Go语言中,切片可以这样理解:
type slice struct {
array unsafe.Pointer
len int
cap int
}
array为数组的指针,len为数组的长度,cap为数组的容量。
当我们使用append方法追加元素到预留的内存空间时,len会相应加1。如果预留空间已经用完,则会申请一块更大的内存空间,在cap < 1024之前,每次扩容都是之前的2倍,当大于1024后,扩容系数则在2-1.25之前。
image
append操作
arr := make([]int, 3, 5)
brr := append(arr, 2)
如上例所示,arr为原始切片,brr为arr插入一个新元素后的切片,此时,arr和brr是共享底层数组的,但是他们的len不同。
截取子切片
arr := make([]int, 3, 5)
brr := arr[1:3]
如上例所示,arr为原始切片,brr为arr的子切片,修改brr中的元素会反映在arr中,但是当子切片执行append操作,耗完了arr预留的内存空间后,子切片和母切片就会内存分离, 此后两个切片没有任何关系。
修改切片中的值
例:
arr := make([]int, 3)
// arr = [0, 0, 0]
for index, value := range arr {
arr[index] = value + index
}
// arr = [0, 1, 2]