underlying-principles.md
底层原理
切片相关
了解切片吗
A:切片是 Go 语言中一种动态数组的抽象,它是对数组的封装,提供了更灵活和方便的操作方式;切片由三部分组成:指向底层数组的指针、切片的长度和切片的容量;切片可以动态增长和缩小,支持对元素的增删改查等操作;切片在内存中是连续存储的,但它本身并不存储数据,而是引用底层数组的数据,它是对底层数组的动态视图;切片可以通过内置函数 make 来创建,也可以通过字面量来创建,比如 s := []int{1, 2, 3};切片还支持切片操作,比如 s[1:3] 表示从索引 1 到索引 3 的子切片
切片和数组的区别是什么?
切片底层的数据结构是什么?有什么特性?
切片是如何扩容的?
-
我们经常会用到一些数组,在 go 中我们叫切片,那我用什么样的方式去分配内存,才能让内存损耗更小呢,就是内存效率更高
-
那假如我们现在有一个切片,中括号后面通常跟的是数据类型对吧,那这个数据类型我可以把它定义成指针吗,你可以简单理解为就是,我们在一个切片里面能存储指针吗
channel 相关
- 介绍一下 channel 的底层原理
map 相关
Q:用 map 来存储数据是怎么样的?(go)
A:go 中的 map 是基于哈希表实现的键值对存储结构,查找效率很高,底层通过哈希函数把 key 分配到不同的 bucket,一个 bucket 能存多个键值对,当负载过高时会自动扩容并重哈希,map 是无序的也不是并发安全的,所以并发写时必须加锁或用标准库的 sync.Map
defer 相关
-
你有用过 defer 这个关键字吗
-
假如说我在 defer 里面处理了一个收尾逻辑,然后我在这个 defer 里面又嵌套了一个 defer,同时我在这个 defer 的最外层还有一个 defer,那这个时候这三个 defer 它们的执行顺序是什么样的,就是首先有一个 defer 里面写了一个 defer,然后我在这个外层的 defer 的下面还有一个同级的 defer
-
那如果现在我们有两个 defer 它是并排的,第一个 defer 的逻辑里抛出了一个异常,或者是发生了一个 panic,那这个时候第二个 defer 还会执行吗