Golang 笔试面试学习第二天之make
Golang轻松学习
个人博客站点:
简书: 😽 猫轻王 https://www.jianshu.com/u/6cce817646be
掘金: 😽 猫轻王 https://juejin.cn/user/1640918680347453
CSDN: 😽 猫轻王 https://blog.csdn.net/moer0
个人项目主页:https://github.com/moercat
一、make 是什么?
Go 语言中 make 关键字主要用于初始化 slice、map 和 channel 并返回初始化之后的值,这个值并不是零值,也不是指针,而是经过初始化之后的 T 的引用。
二、详细代码
1.make slice的逻辑
代码如下(示例):
func main() {
s := make([]int, 5)
s = append(s, 1, 2, 3)
fmt.Println(s)
}
func main() {
s := make([]int,0)
s = append(s,1,2,3,4)
fmt.Println(s)
}
输出:
[0 0 0 0 0 1 2 3]
[1 2 3 4]
结果:
这道题其实考察的就是make的基本使用,当初始化切片时,
make([]int, a,b),其中a是该初始化切片的个数,b是该初始化切片的容量。
我们学习过,当go 中的切片扩容时,当容量小于1024时会直接翻倍,而超过时每次只会增加0.25倍,也就是 1n+0.25n,所以我们在初始时可以进行定容,使得切片不会超出容量不进行扩容。
该题主要的还是在 a 切片内元素个数,由于我们初始化个数不为零,也就是让切片其中初始存在 5 个数,初始的元素也就是切片的默认元素, 数值类型 int 就是 0,字符串就是 ““。而了解了这点,那么其实我们也就可以知道,make([]int, 5) 其实已经等于 [0 0 0 0 0 ] ,之后append 自然会出现
[0 0 0 0 0 1 2 3]。
2.make map 的逻辑
对 map 来说,make只用来初始化容量,而非key的个数。
由于map的扩容规则可能会改变存储地址,若我们也可以预估key的数量,也可以初始化容量,这也会节省我们的空间与时间,省去扩容行为。
2.make channel 的逻辑
channel 较为特殊,当我们对其make(chan int,0)时,也就是不设置缓冲区,那么当我们写入时 chan <- 将会阻塞直到另一个协程的读取 <- chan。而当我们设置缓冲区时make(chan int,1),意思就是我们可以预先存入几个元素,而不会阻塞。当缓冲区溢出时,我们存入第二个元素依然需要等待其他协程读取才可以继续存入。
总结
make在生产环境其实使用的很多,当切片在不初始化时都是nil,而非我们通常意义上的空数组 [],当chan make设置时,则可以用来作为计数器或协程处理其他业务需要。将串行任务一步步转化为并行任务。
希望这个博客能对你有所益处。我是轻王,我为自己代言。